diff --git a/DEPS b/DEPS index b78888e..d9378bf6 100644 --- a/DEPS +++ b/DEPS
@@ -44,7 +44,7 @@ # 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': '389ea8091864d6c04455217efb52f4d4337d4985', + 'v8_revision': '7bed2acecb47d97bfea387717ec4f1afa32f1b76', # 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.
diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc index 13b51b1d..250b74a9 100644 --- a/base/metrics/persistent_histogram_allocator.cc +++ b/base/metrics/persistent_histogram_allocator.cc
@@ -21,6 +21,7 @@ #include "base/metrics/sparse_histogram.h" #include "base/metrics/statistics_recorder.h" #include "base/pickle.h" +#include "base/strings/stringprintf.h" #include "base/synchronization/lock.h" namespace base { @@ -819,19 +820,43 @@ FilePath* out_base_path, FilePath* out_active_path, FilePath* out_spare_path) { - if (out_base_path) { - *out_base_path = dir.AppendASCII(name).AddExtension( - PersistentMemoryAllocator::kFileExtension); - } + if (out_base_path) + *out_base_path = MakeMetricsFilePath(dir, name); + if (out_active_path) { *out_active_path = - dir.AppendASCII(name.as_string() + std::string("-active")) - .AddExtension(PersistentMemoryAllocator::kFileExtension); + MakeMetricsFilePath(dir, name.as_string().append("-active")); } + if (out_spare_path) { *out_spare_path = - dir.AppendASCII(name.as_string() + std::string("-spare")) - .AddExtension(PersistentMemoryAllocator::kFileExtension); + MakeMetricsFilePath(dir, name.as_string().append("-spare")); + } +} + +// static +void GlobalHistogramAllocator::ConstructFilePathsForUploadDir( + const FilePath& active_dir, + const FilePath& upload_dir, + const std::string& name, + FilePath* out_upload_path, + FilePath* out_active_path, + FilePath* out_spare_path) { + if (out_upload_path) { + std::string name_stamp = + StringPrintf("%s-%X", name.c_str(), + static_cast<unsigned int>(Time::Now().ToTimeT())); + *out_upload_path = MakeMetricsFilePath(upload_dir, name_stamp); + } + + if (out_active_path) { + *out_active_path = + MakeMetricsFilePath(active_dir, name + std::string("-active")); + } + + if (out_spare_path) { + *out_spare_path = + MakeMetricsFilePath(active_dir, name + std::string("-spare")); } } @@ -1021,4 +1046,11 @@ } } +// static +FilePath GlobalHistogramAllocator::MakeMetricsFilePath(const FilePath& dir, + StringPiece name) { + return dir.AppendASCII(name).AddExtension( + PersistentMemoryAllocator::kFileExtension); +} + } // namespace base
diff --git a/base/metrics/persistent_histogram_allocator.h b/base/metrics/persistent_histogram_allocator.h index 8a8d4cb..a6e2ff5 100644 --- a/base/metrics/persistent_histogram_allocator.h +++ b/base/metrics/persistent_histogram_allocator.h
@@ -435,6 +435,16 @@ FilePath* out_active_path, FilePath* out_spare_path); + // As above but puts the base files in a different "upload" directory. This + // is useful when moving all completed files into a single directory for easy + // upload management. + static void ConstructFilePathsForUploadDir(const FilePath& active_dir, + const FilePath& upload_dir, + const std::string& name, + FilePath* out_upload_path, + FilePath* out_active_path, + FilePath* out_spare_path); + // Create a "spare" file that can later be made the "active" file. This // should be done on a background thread if possible. static bool CreateSpareFile(const FilePath& spare_path, size_t size); @@ -504,6 +514,9 @@ // nothing new has been added. void ImportHistogramsToStatisticsRecorder(); + // Builds a FilePath for a metrics file. + static FilePath MakeMetricsFilePath(const FilePath& dir, StringPiece name); + // Import always continues from where it left off, making use of a single // iterator to continue the work. Iterator import_iterator_;
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc index 3d8ea8bd..033f9818 100644 --- a/chrome/browser/chrome_browser_field_trials.cc +++ b/chrome/browser/chrome_browser_field_trials.cc
@@ -61,18 +61,44 @@ if (!base::PathService::Get(chrome::DIR_USER_DATA, &metrics_dir)) return; - base::FilePath metrics_file; - base::FilePath active_file; - base::FilePath spare_file; + // Remove any existing file from its legacy location. + // TODO(bcwhite): Remove this block of code in M62 or later. + base::FilePath legacy_file; base::GlobalHistogramAllocator::ConstructFilePaths( metrics_dir, ChromeMetricsServiceClient::kBrowserMetricsName, - &metrics_file, &active_file, &spare_file); + &legacy_file, nullptr, nullptr); + base::PostTaskWithTraits( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BACKGROUND, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(base::IgnoreResult(&base::DeleteFile), + base::Passed(&legacy_file), /*recursive=*/false)); + + // Create a directory for storing completed metrics files. Files in this + // directory must have embedded system profiles. If the directory can't be + // created, the file will just be deleted below. + base::FilePath upload_dir = + metrics_dir.AppendASCII(ChromeMetricsServiceClient::kBrowserMetricsName); + base::CreateDirectory(upload_dir); + + // Metrics files are typically created as a |spare_file| in the profile + // directory (e.g. "BrowserMetrics-spare.pma") and are then rotated into + // the |active_file| (e.g. "BrowserMetrics-active.pma") location for use + // during the browser run. It is then moved to a time-stamped file in a + // subdirectory (e.g. "BrowserMetrics/BrowserMetrics-1234ABCD.pma") for + // upload when convenient. + base::FilePath upload_file; + base::FilePath active_file; + base::FilePath spare_file; + base::GlobalHistogramAllocator::ConstructFilePathsForUploadDir( + metrics_dir, upload_dir, ChromeMetricsServiceClient::kBrowserMetricsName, + &upload_file, &active_file, &spare_file); // Move any existing "active" file to the final name from which it will be // read when reporting initial stability metrics. If there is no file to // move, remove any old, existing file from before the previous session. - if (!base::ReplaceFile(active_file, metrics_file, nullptr)) - base::DeleteFile(metrics_file, /*recursive=*/false); + if (!base::ReplaceFile(active_file, upload_file, nullptr)) + base::DeleteFile(active_file, /*recursive=*/false); // This is used to report results to an UMA histogram. enum InitResult {
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 2feb595e..721b052 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -26,6 +26,7 @@ #include "base/path_service.h" #include "base/rand_util.h" #include "base/strings/string16.h" +#include "base/task_scheduler/post_task.h" #include "base/threading/platform_thread.h" #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" @@ -215,19 +216,6 @@ base::FilePath user_data_dir; if (base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) { - // Reporting of persistent histograms from last session is controlled by - // a feature param. TODO(bcwhite): The current default is not to upload - // until some issues are resolved. See crbug.com/706422 for details. - std::string send_unreported = base::GetFieldTrialParamValueByFeature( - base::kPersistentHistogramsFeature, "send_unreported_metrics"); - bool report_previous_persistent_histograms = - metrics_reporting_enabled && (send_unreported == "yes"); - RegisterOrRemovePreviousRunMetricsFile( - report_previous_persistent_histograms, user_data_dir, - ChromeMetricsServiceClient::kBrowserMetricsName, - metrics::FileMetricsProvider::ASSOCIATE_INTERNAL_PROFILE, task_runner, - file_metrics_provider.get()); - // Register the Crashpad metrics files. // Register the data from the previous run if crashpad_handler didn't exit // cleanly. @@ -237,7 +225,16 @@ metrics::FileMetricsProvider:: ASSOCIATE_INTERNAL_PROFILE_OR_PREVIOUS_RUN, task_runner, file_metrics_provider.get()); + + base::FilePath browser_metrics_upload_dir = user_data_dir.AppendASCII( + ChromeMetricsServiceClient::kBrowserMetricsName); if (metrics_reporting_enabled) { + file_metrics_provider->RegisterSource( + browser_metrics_upload_dir, + metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, + metrics::FileMetricsProvider::ASSOCIATE_INTERNAL_PROFILE, + ChromeMetricsServiceClient::kBrowserMetricsName); + base::FilePath active_path; base::GlobalHistogramAllocator::ConstructFilePaths( user_data_dir, kCrashpadHistogramAllocatorName, nullptr, &active_path, @@ -249,6 +246,16 @@ metrics::FileMetricsProvider::SOURCE_HISTOGRAMS_ACTIVE_FILE, metrics::FileMetricsProvider::ASSOCIATE_CURRENT_RUN, base::StringPiece()); + } else { + // When metrics reporting is not enabled, any existing files should be + // deleted in order to preserve user privacy. + base::PostTaskWithTraits( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BACKGROUND, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(base::IgnoreResult(&base::DeleteFile), + base::Passed(&browser_metrics_upload_dir), + /*recursive=*/true)); } }
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_browsertest.cc index 93f4268a..6bb5288a 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest.cc
@@ -399,8 +399,7 @@ EXPECT_TRUE(styled_label); // The Link is the only child of the StyledLabel. content::WebContentsAddedObserver web_contents_added_observer; - styled_label->LinkClicked( - static_cast<views::Link*>(styled_label->child_at(0)), 0); + styled_label->LinkClicked(nullptr, 0); content::WebContents* new_tab_contents = web_contents_added_observer.GetWebContents();
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc index 52696dc..e11cc53 100644 --- a/components/metrics/file_metrics_provider.cc +++ b/components/metrics/file_metrics_provider.cc
@@ -418,7 +418,7 @@ void FileMetricsProvider::RecordHistogramSnapshotsFromSource( base::HistogramSnapshotManager* snapshot_manager, SourceInfo* source) { - DCHECK_EQ(SOURCE_HISTOGRAMS_ATOMIC_FILE, source->type); + DCHECK_NE(SOURCE_HISTOGRAMS_ACTIVE_FILE, source->type); base::PersistentHistogramAllocator::Iterator histogram_iter( source->allocator.get()); @@ -574,6 +574,8 @@ RecordSourceAsRead(source); sources_to_check_.splice(sources_to_check_.end(), sources_with_profile_, sources_with_profile_.begin()); + ScheduleSourcesCheck(); + if (success) return true; }
diff --git a/components/metrics/file_metrics_provider.h b/components/metrics/file_metrics_provider.h index a19577b..6573475b 100644 --- a/components/metrics/file_metrics_provider.h +++ b/components/metrics/file_metrics_provider.h
@@ -57,7 +57,9 @@ // the ImportantFileWriter) will not get read. Files that have been // read will be attempted to be deleted; should those files not be // deletable by this process, it is the reponsibility of the producer - // to keep the directory pruned in some manner. + // to keep the directory pruned in some manner. Added files must have a + // timestamp later (not the same or earlier) than the newest file that + // already exists or it may be assumed to have been already uploaded. SOURCE_HISTOGRAMS_ATOMIC_DIR, // "Active" files may be open by one or more other processes and updated
diff --git a/components/metrics/file_metrics_provider_unittest.cc b/components/metrics/file_metrics_provider_unittest.cc index 42e38bc7..a62ff632 100644 --- a/components/metrics/file_metrics_provider_unittest.cc +++ b/components/metrics/file_metrics_provider_unittest.cc
@@ -597,4 +597,58 @@ EXPECT_FALSE(base::PathExists(metrics_file())); } +TEST_P(FileMetricsProviderTest, AccessEmbeddedProfileMetricsFromDir) { + const int file_count = 3; + base::Time file_base_time = base::Time::Now(); + std::vector<base::FilePath> file_names; + for (int i = 0; i < file_count; ++i) { + CreateMetricsFileWithHistograms( + 2, [](base::PersistentHistogramAllocator* allocator) { + SystemProfileProto profile_proto; + SystemProfileProto::FieldTrial* trial = + profile_proto.add_field_trial(); + trial->set_name_id(123); + trial->set_group_id(456); + + PersistentSystemProfile persistent_profile; + persistent_profile.RegisterPersistentAllocator( + allocator->memory_allocator()); + persistent_profile.SetSystemProfile(profile_proto, true); + }); + ASSERT_TRUE(PathExists(metrics_file())); + char new_name[] = "hX"; + new_name[1] = '1' + i; + base::FilePath file_name = temp_dir().AppendASCII(new_name).AddExtension( + base::PersistentMemoryAllocator::kFileExtension); + base::Time file_time = + file_base_time - base::TimeDelta::FromMinutes(file_count - i); + base::TouchFile(metrics_file(), file_time, file_time); + base::Move(metrics_file(), file_name); + file_names.push_back(std::move(file_name)); + } + + // Register the file and allow the "checker" task to run. + provider()->RegisterSource( + temp_dir(), FileMetricsProvider::SOURCE_HISTOGRAMS_ATOMIC_DIR, + FileMetricsProvider::ASSOCIATE_INTERNAL_PROFILE, ""); + + OnDidCreateMetricsLog(); + RunTasks(); + + // A read of metrics with internal profiles should return one result. + HistogramFlattenerDeltaRecorder flattener; + base::HistogramSnapshotManager snapshot_manager(&flattener); + SystemProfileProto profile; + for (int i = 0; i < file_count; ++i) { + EXPECT_TRUE(ProvideIndependentMetrics(&profile, &snapshot_manager)) << i; + RunTasks(); + } + EXPECT_FALSE(ProvideIndependentMetrics(&profile, &snapshot_manager)); + + OnDidCreateMetricsLog(); + RunTasks(); + for (const auto& file_name : file_names) + EXPECT_FALSE(base::PathExists(file_name)); +} + } // namespace metrics
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc index 2cd6ade..669dc5a0 100644 --- a/components/password_manager/core/browser/password_manager.cc +++ b/components/password_manager/core/browser/password_manager.cc
@@ -718,6 +718,21 @@ DCHECK(provisional_save_manager_->submitted_form()); if (!client_->GetStoreResultFilter()->ShouldSave( *provisional_save_manager_->submitted_form())) { +#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + // When |username_value| is empty, it's not clear whether the submitted + // credentials are really sync credentials. Don't save sync password hash + // in that case. + if (!provisional_save_manager_->submitted_form() + ->username_value.empty()) { + password_manager::PasswordStore* store = client_->GetPasswordStore(); + // May be null in tests. + if (store) { + store->SaveSyncPasswordHash( + provisional_save_manager_->submitted_form()->password_value); + } + } +#endif provisional_save_manager_->WipeStoreCopyIfOutdated(); client_->GetMetricsRecorder().RecordProvisionalSaveFailure( PasswordManagerMetricsRecorder::SYNC_CREDENTIAL, main_frame_url_,
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 3fcca5a3..6999bc91 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -576,6 +576,10 @@ // User should not be prompted and password should not be saved. EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)).Times(0); EXPECT_CALL(*store_, AddLogin(_)).Times(0); +#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + EXPECT_CALL(*store_, SaveSyncPasswordHash(form.password_value)); +#endif // Prefs are needed for failure logging about sync credentials. EXPECT_CALL(client_, GetPrefs()).WillRepeatedly(Return(nullptr)); EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) @@ -647,6 +651,10 @@ EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) .WillRepeatedly(Return(true)); EXPECT_CALL(client_, GetPrefs()).WillRepeatedly(Return(nullptr)); +#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + EXPECT_CALL(*store_, SaveSyncPasswordHash(form.password_value)); +#endif manager()->ProvisionallySavePassword(form, nullptr); // Chrome should not remove the sync credential, because it was successfully @@ -680,6 +688,10 @@ EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) .WillRepeatedly(Return(true)); EXPECT_CALL(client_, GetPrefs()).WillRepeatedly(Return(nullptr)); +#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) + EXPECT_CALL(*store_, SaveSyncPasswordHash(ASCIIToUTF16("n3w passw0rd"))); +#endif manager()->ProvisionallySavePassword(updated_form, nullptr); client_.FilterAllResultsForSaving(); @@ -1725,4 +1737,63 @@ manager()->OnPasswordFormsRendered(&driver_, observed, true); } +#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) || \ + (defined(OS_LINUX) && !defined(OS_CHROMEOS)) +// Check that no sync password hash is saved when no username is available, +// because we it's not clear whether the submitted credentials are sync +// credentials. +TEST_F(PasswordManagerTest, NotSavingSyncPasswordHash_NoUsername) { + // Simulate loading a simple form with no existing stored password. + std::vector<PasswordForm> observed; + PasswordForm form(MakeSimpleGAIAForm()); + // Simulate that no username is found. + form.username_value.clear(); + observed.push_back(form); + EXPECT_CALL(*store_, GetLogins(_, _)) + .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms())); + manager()->OnPasswordFormsRendered(&driver_, observed, true); + + EXPECT_CALL(client_, GetPrefs()).WillRepeatedly(Return(nullptr)); + EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) + .WillRepeatedly(Return(true)); + + // Simulate that this credentials which is similar to be sync credentials. + client_.FilterAllResultsForSaving(); + + // Check that no sync credential password hash is saved. + EXPECT_CALL(*store_, SaveSyncPasswordHash(_)).Times(0); + OnPasswordFormSubmitted(form); + observed.clear(); + manager()->OnPasswordFormsRendered(&driver_, observed, true); +} + +// Check that no sync password hash is saved when the submitted credentials are +// not qualified as sync credentials. +TEST_F(PasswordManagerTest, NotSavingSyncPasswordHash_NotSyncCredentials) { + // Simulate loading a simple form with no existing stored password. + std::vector<PasswordForm> observed; + PasswordForm form(MakeSimpleGAIAForm()); + observed.push_back(form); + EXPECT_CALL(*store_, GetLogins(_, _)) + .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms())); + manager()->OnPasswordFormsRendered(&driver_, observed, true); + + EXPECT_CALL(client_, GetPrefs()).WillRepeatedly(Return(nullptr)); + EXPECT_CALL(client_, IsSavingAndFillingEnabledForCurrentPage()) + .WillRepeatedly(Return(true)); + + // Check that no sync credential password hash is saved since these + // credentials are eligible for saving. + EXPECT_CALL(*store_, SaveSyncPasswordHash(_)).Times(0); + + std::unique_ptr<PasswordFormManager> form_manager_to_save; + EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr(_)) + .WillOnce(WithArg<0>(SaveToScopedPtr(&form_manager_to_save))); + + OnPasswordFormSubmitted(form); + observed.clear(); + manager()->OnPasswordFormsRendered(&driver_, observed, true); +} +#endif + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_syncable_service.cc b/components/password_manager/core/browser/password_syncable_service.cc index 4a8832d..75d20b2 100644 --- a/components/password_manager/core/browser/password_syncable_service.cc +++ b/components/password_manager/core/browser/password_syncable_service.cc
@@ -91,19 +91,6 @@ entries->back()->date_synced = sync_time; } -bool IsEmptyPasswordForm(const autofill::PasswordForm& form) { - return (form.username_value.empty() && - form.password_value.empty() && - !form.blacklisted_by_user); -} - -bool IsEmptyPasswordSpecificsData( - const sync_pb::PasswordSpecificsData& specifics) { - return (specifics.username_value().empty() && - specifics.password_value().empty() && - !specifics.blacklisted()); -} - } // namespace struct PasswordSyncableService::SyncEntries { @@ -190,19 +177,9 @@ for (PasswordEntryMap::iterator it = new_local_entries.begin(); it != new_local_entries.end(); ++it) { - if (IsEmptyPasswordForm(*it->second)) { - // http://crbug.com/404012. Remove the empty password from the local db. - // This code can be removed once all users have their password store - // cleaned up. This should happen in M43 and can be verified using crash - // reports. - sync_entries.deleted_entries.push_back( - base::MakeUnique<autofill::PasswordForm>(*it->second)); - } else { - updated_db_entries.push_back( - syncer::SyncChange(FROM_HERE, - syncer::SyncChange::ACTION_ADD, - SyncDataFromPassword(*it->second))); - } + updated_db_entries.push_back( + syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD, + SyncDataFromPassword(*it->second))); } WriteToPasswordStore(sync_entries); @@ -378,21 +355,10 @@ unmatched_data_from_password_db->find(tag); base::Time time_now = base::Time::Now(); if (existing_local_entry_iter == unmatched_data_from_password_db->end()) { - if (IsEmptyPasswordSpecificsData(password_specifics)) { - // http://crbug.com/404012. Remove the empty password from the Sync - // server. This code can be removed once all users have their password - // store cleaned up. This should happen in M43 and can be verified using - // crash reports. - updated_db_entries->push_back( - syncer::SyncChange(FROM_HERE, - syncer::SyncChange::ACTION_DELETE, - data)); - } else { // The sync data is not in the password store, so we need to create it in // the password store. Add the entry to the new_entries list. AppendPasswordFromSpecifics(password_specifics, time_now, &sync_entries->new_entries); - } } else { // The entry is in password store. If the entries are not identical, then // the entries need to be merged. @@ -410,17 +376,6 @@ AppendPasswordFromSpecifics(password_specifics, time_now, &sync_entries->updated_entries); } - } else if (IsEmptyPasswordForm(password_form)) { - // http://crbug.com/404012. Remove empty passwords from both the Sync - // server and the local db. This code can be removed once all users have - // their password store cleaned up. This should happen in M43 and can be - // verified using crash reports. - updated_db_entries->push_back( - syncer::SyncChange(FROM_HERE, - syncer::SyncChange::ACTION_DELETE, - SyncDataFromPassword(password_form))); - AppendPasswordFromSpecifics(password_specifics, time_now, - &sync_entries->deleted_entries); } // Remove the entry from the entry map to indicate a match has been found. // Entries that remain in the map at the end of associating all sync entries
diff --git a/components/password_manager/core/browser/password_syncable_service_unittest.cc b/components/password_manager/core/browser/password_syncable_service_unittest.cc index bb3a731bf..aa55f28 100644 --- a/components/password_manager/core/browser/password_syncable_service_unittest.cc +++ b/components/password_manager/core/browser/password_syncable_service_unittest.cc
@@ -553,38 +553,6 @@ service()->ActOnPasswordStoreChanges(list); } -// Tests that empty forms known to the client and/or the server are deleted. -TEST_F(PasswordSyncableServiceTest, MergeEmptyPasswords) { - autofill::PasswordForm old_empty_form; - old_empty_form.signon_realm = kSignonRealm; - old_empty_form.times_used = kTimesUsed; - old_empty_form.type = kArbitraryType; - - autofill::PasswordForm db_empty_form = old_empty_form; - db_empty_form.signon_realm = kSignonRealm2; - - autofill::PasswordForm sync_empty_form = old_empty_form; - sync_empty_form.signon_realm = kSignonRealm3; - SyncDataList sync_data; - sync_data.push_back(SyncDataFromPassword(old_empty_form)); - sync_data.push_back(SyncDataFromPassword(sync_empty_form)); - - EXPECT_CALL(*password_store(), FillAutofillableLogins(_)) - .WillOnce(DoAll(IgnoreResult(AppendForm(old_empty_form)), - AppendForm(db_empty_form))); - EXPECT_CALL(*password_store(), FillBlacklistLogins(_)).WillOnce(Return(true)); - - EXPECT_CALL(*password_store(), RemoveLoginImpl(PasswordIs(old_empty_form))); - EXPECT_CALL(*password_store(), RemoveLoginImpl(PasswordIs(db_empty_form))); - EXPECT_CALL(*processor_, ProcessSyncChanges(_, ElementsAre( - SyncChangeIs(SyncChange::ACTION_DELETE, old_empty_form), - SyncChangeIs(SyncChange::ACTION_DELETE, sync_empty_form)))); - - service()->MergeDataAndStartSyncing( - syncer::PASSWORDS, sync_data, std::move(processor_), - std::unique_ptr<syncer::SyncErrorFactory>()); -} - // Serialize and deserialize empty federation_origin and make sure it's an empty // string. TEST_F(PasswordSyncableServiceTest, SerializeEmptyFederation) {
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc index cef3f9a..dc42db7 100644 --- a/content/browser/frame_host/cross_process_frame_connector.cc +++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -183,7 +183,9 @@ void CrossProcessFrameConnector::BubbleScrollEvent( const blink::WebGestureEvent& event) { - DCHECK(event.GetType() == blink::WebInputEvent::kGestureScrollUpdate || + DCHECK((view_->wheel_scroll_latching_enabled() && + event.GetType() == blink::WebInputEvent::kGestureScrollBegin) || + event.GetType() == blink::WebInputEvent::kGestureScrollUpdate || event.GetType() == blink::WebInputEvent::kGestureScrollEnd || event.GetType() == blink::WebInputEvent::kGestureFlingStart); auto* parent_view = GetParentRenderWidgetHostView(); @@ -202,14 +204,28 @@ // See https://crbug.com/626020. resent_gesture_event.x += offset_from_parent.x(); resent_gesture_event.y += offset_from_parent.y(); - if (event.GetType() == blink::WebInputEvent::kGestureScrollUpdate) { - event_router->BubbleScrollEvent(parent_view, resent_gesture_event); - is_scroll_bubbling_ = true; - } else if ((event.GetType() == blink::WebInputEvent::kGestureScrollEnd || - event.GetType() == blink::WebInputEvent::kGestureFlingStart) && - is_scroll_bubbling_) { - event_router->BubbleScrollEvent(parent_view, resent_gesture_event); - is_scroll_bubbling_ = false; + + if (view_->wheel_scroll_latching_enabled()) { + if (event.GetType() == blink::WebInputEvent::kGestureScrollBegin) { + event_router->BubbleScrollEvent(parent_view, resent_gesture_event); + is_scroll_bubbling_ = true; + } else if (is_scroll_bubbling_) { + event_router->BubbleScrollEvent(parent_view, resent_gesture_event); + } + if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd || + event.GetType() == blink::WebInputEvent::kGestureFlingStart) { + is_scroll_bubbling_ = false; + } + } else { // !view_->wheel_scroll_latching_enabled() + if (event.GetType() == blink::WebInputEvent::kGestureScrollUpdate) { + event_router->BubbleScrollEvent(parent_view, resent_gesture_event); + is_scroll_bubbling_ = true; + } else if ((event.GetType() == blink::WebInputEvent::kGestureScrollEnd || + event.GetType() == blink::WebInputEvent::kGestureFlingStart) && + is_scroll_bubbling_) { + event_router->BubbleScrollEvent(parent_view, resent_gesture_event); + is_scroll_bubbling_ = false; + } } }
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame.cc b/content/browser/frame_host/render_widget_host_view_child_frame.cc index d2d540f..f3d24295 100644 --- a/content/browser/frame_host/render_widget_host_view_child_frame.cc +++ b/content/browser/frame_host/render_widget_host_view_child_frame.cc
@@ -403,19 +403,35 @@ InputEventAckState ack_result) { bool not_consumed = ack_result == INPUT_EVENT_ACK_STATE_NOT_CONSUMED || ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; - // GestureScrollBegin is consumed by the target frame and not forwarded, - // because we don't know whether we will need to bubble scroll until we - // receive a GestureScrollUpdate ACK. GestureScrollUpdate with unused - // scroll extent is forwarded for bubbling, while GestureScrollEnd is - // always forwarded and handled according to current scroll state in the - // RenderWidgetHostInputEventRouter. + if (!frame_connector_) return; - if ((event.GetType() == blink::WebInputEvent::kGestureScrollUpdate && - not_consumed) || - event.GetType() == blink::WebInputEvent::kGestureScrollEnd || - event.GetType() == blink::WebInputEvent::kGestureFlingStart) { - frame_connector_->BubbleScrollEvent(event); + if (wheel_scroll_latching_enabled()) { + // GestureScrollBegin is a blocking event; It is forwarded for bubbling if + // its ack is not consumed. For the rest of the scroll events + // (GestureScrollUpdate, GestureScrollEnd, GestureFlingStart) the + // frame_connector_ decides to forward them for bubbling if the + // GestureScrollBegin event is forwarded. + if ((event.GetType() == blink::WebInputEvent::kGestureScrollBegin && + not_consumed) || + event.GetType() == blink::WebInputEvent::kGestureScrollUpdate || + event.GetType() == blink::WebInputEvent::kGestureScrollEnd || + event.GetType() == blink::WebInputEvent::kGestureFlingStart) { + frame_connector_->BubbleScrollEvent(event); + } + } else { + // GestureScrollBegin is consumed by the target frame and not forwarded, + // because we don't know whether we will need to bubble scroll until we + // receive a GestureScrollUpdate ACK. GestureScrollUpdate with unused + // scroll extent is forwarded for bubbling, while GestureScrollEnd is + // always forwarded and handled according to current scroll state in the + // RenderWidgetHostInputEventRouter. + if ((event.GetType() == blink::WebInputEvent::kGestureScrollUpdate && + not_consumed) || + event.GetType() == blink::WebInputEvent::kGestureScrollEnd || + event.GetType() == blink::WebInputEvent::kGestureFlingStart) { + frame_connector_->BubbleScrollEvent(event); + } } }
diff --git a/content/browser/renderer_host/input/legacy_input_router_impl.cc b/content/browser/renderer_host/input/legacy_input_router_impl.cc index 9c752e5..823f4c6 100644 --- a/content/browser/renderer_host/input/legacy_input_router_impl.cc +++ b/content/browser/renderer_host/input/legacy_input_router_impl.cc
@@ -88,9 +88,9 @@ current_ack_source_(ACK_SOURCE_NONE), active_renderer_fling_count_(0), touch_scroll_started_sent_(false), - wheel_event_queue_(this, - base::FeatureList::IsEnabled( - features::kTouchpadAndWheelScrollLatching)), + wheel_scroll_latching_enabled_(base::FeatureList::IsEnabled( + features::kTouchpadAndWheelScrollLatching)), + wheel_event_queue_(this, wheel_scroll_latching_enabled_), gesture_event_queue_(this, this, config.gesture_config), device_scale_factor_(1.f), raf_aligned_touch_enabled_( @@ -376,7 +376,7 @@ return; bool should_block = WebInputEventTraits::ShouldBlockEventStream( - input_event, raf_aligned_touch_enabled_); + input_event, raf_aligned_touch_enabled_, wheel_scroll_latching_enabled_); OfferToRenderer(input_event, latency_info, should_block ? InputEventDispatchType::DISPATCH_TYPE_BLOCKING
diff --git a/content/browser/renderer_host/input/legacy_input_router_impl.h b/content/browser/renderer_host/input/legacy_input_router_impl.h index 4398b18..a285754 100644 --- a/content/browser/renderer_host/input/legacy_input_router_impl.h +++ b/content/browser/renderer_host/input/legacy_input_router_impl.h
@@ -240,6 +240,8 @@ // gesture scroll yet. bool touch_scroll_started_sent_; + bool wheel_scroll_latching_enabled_; + MouseWheelEventQueue wheel_event_queue_; std::unique_ptr<TouchEventQueue> touch_event_queue_; GestureEventQueue gesture_event_queue_;
diff --git a/content/browser/renderer_host/input/legacy_input_router_impl_perftest.cc b/content/browser/renderer_host/input/legacy_input_router_impl_perftest.cc index 0704dc0..157bac3 100644 --- a/content/browser/renderer_host/input/legacy_input_router_impl_perftest.cc +++ b/content/browser/renderer_host/input/legacy_input_router_impl_perftest.cc
@@ -207,7 +207,8 @@ bool ShouldBlockEventStream(const blink::WebInputEvent& event) { return ui::WebInputEventTraits::ShouldBlockEventStream( event, - base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents)); + base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents), + base::FeatureList::IsEnabled(features::kTouchpadAndWheelScrollLatching)); } } // namespace
diff --git a/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc b/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc index 178797d1..e29ca61 100644 --- a/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc +++ b/content/browser/renderer_host/input/legacy_input_router_impl_unittest.cc
@@ -66,7 +66,8 @@ bool ShouldBlockEventStream(const blink::WebInputEvent& event) { return ui::WebInputEventTraits::ShouldBlockEventStream( event, - base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents)); + base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents), + base::FeatureList::IsEnabled(features::kTouchpadAndWheelScrollLatching)); } const WebInputEvent* GetInputEventFromMessage(const IPC::Message& message) { @@ -375,6 +376,13 @@ input_router_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack)); } + void SendScrollBeginAckIfNeeded(InputEventAckState ack_result) { + if (wheel_scroll_latching_enabled_) { + // GSB events are blocking, send the ack. + SendInputEventACK(WebInputEvent::kGestureScrollBegin, ack_result); + } + } + void SendTouchEventACK(blink::WebInputEvent::Type type, InputEventAckState ack_result, uint32_t touch_event_id) { @@ -1087,6 +1095,7 @@ // Indicate that the wheel event was unhandled. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); // Check that the ack for the MouseWheel and ScrollBegin // were processed. @@ -1168,15 +1177,17 @@ SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); + // Check that the ack for the first MouseWheel, ScrollBegin, and the second // MouseWheel were processed. EXPECT_EQ(3U, ack_handler_->GetAndResetAckCount()); - // There should be a ScrollBegin and ScrollUpdate, MouseWheel sent. + // There should be a ScrollBegin, MouseWheel, and coalesced ScrollUpdate sent. EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); // The last acked wheel event should be the second one since the input router - // has alread sent the immediate ack for the second wheel event. + // has already sent the immediate ack for the second wheel event. EXPECT_EQ(ack_handler_->acked_wheel_event().delta_y, -10); EXPECT_EQ(INPUT_EVENT_ACK_STATE_IGNORED, ack_handler_->acked_wheel_event_state()); @@ -1184,16 +1195,9 @@ SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_CONSUMED); - // Check that the ack for the first ScrollUpdate were processed. - EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); - - // There should be a second ScrollUpdate sent. - EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); - - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_CONSUMED); - - // Check that the ack for ScrollUpdate were processed. + // Check that the ack for the coalesced ScrollUpdate were processed. + EXPECT_EQ(-15, + ack_handler_->acked_gesture_event().data.scroll_update.delta_y); EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); } @@ -1333,6 +1337,7 @@ SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ASSERT_EQ(1U, GetSentMessageCountAndResetSink()); EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); EXPECT_EQ(0, client_->in_flight_event_count()); @@ -1397,6 +1402,7 @@ TEST_F(LegacyInputRouterImplTest, GestureShowPressIsInOrder) { SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); @@ -1612,6 +1618,7 @@ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SimulateGestureEvent(WebInputEvent::kGestureScrollEnd, blink::kWebGestureDeviceTouchscreen); @@ -1667,6 +1674,7 @@ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SimulateGestureEvent(WebInputEvent::kGestureScrollEnd, blink::kWebGestureDeviceTouchscreen); @@ -1712,6 +1720,7 @@ // removed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SimulateGestureEvent(WebInputEvent::kGestureScrollEnd, blink::kWebGestureDeviceTouchscreen); @@ -1734,6 +1743,7 @@ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
diff --git a/content/browser/renderer_host/input/non_blocking_event_browsertest.cc b/content/browser/renderer_host/input/non_blocking_event_browsertest.cc index 5c13f00..593f934 100644 --- a/content/browser/renderer_host/input/non_blocking_event_browsertest.cc +++ b/content/browser/renderer_host/input/non_blocking_event_browsertest.cc
@@ -131,8 +131,10 @@ scoped_refptr<InputMsgWatcher> input_msg_watcher(new InputMsgWatcher( GetWidgetHost(), blink::WebInputEvent::kMouseWheel)); - GetWidgetHost()->ForwardWheelEvent( - SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, -53, 0, true)); + blink::WebMouseWheelEvent wheel_event = + SyntheticWebMouseWheelEventBuilder::Build(10, 10, 0, -53, 0, true); + wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; + GetWidgetHost()->ForwardWheelEvent(wheel_event); // Runs until we get the InputMsgAck callback EXPECT_EQ(INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING,
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc index d537fb1..048665f6 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -586,13 +586,10 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent( RenderWidgetHostViewBase* target_view, const blink::WebGestureEvent& event) { - // TODO(kenrb, tdresser): This needs to be refactored when scroll latching - // is implemented (see https://crbug.com/526463). This design has some - // race problems that can result in lost scroll delta, which are very - // difficult to resolve until this is changed to do all scroll targeting, - // including bubbling, based on GestureScrollBegin. DCHECK(target_view); - DCHECK(event.GetType() == blink::WebInputEvent::kGestureScrollUpdate || + DCHECK((target_view->wheel_scroll_latching_enabled() && + event.GetType() == blink::WebInputEvent::kGestureScrollBegin) || + event.GetType() == blink::WebInputEvent::kGestureScrollUpdate || event.GetType() == blink::WebInputEvent::kGestureScrollEnd || event.GetType() == blink::WebInputEvent::kGestureFlingStart); // DCHECK_XNOR the current and original bubble targets. Both should be set @@ -603,6 +600,49 @@ ui::LatencyInfo latency_info = ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event); + if (target_view->wheel_scroll_latching_enabled()) { + if (event.GetType() == blink::WebInputEvent::kGestureScrollBegin) { + // If target_view has unrelated gesture events in progress, do + // not proceed. This could cause confusion between independent + // scrolls. + if (target_view == touchscreen_gesture_target_.target || + target_view == touchpad_gesture_target_.target || + target_view == touch_target_.target) { + return; + } + + // This accounts for bubbling through nested OOPIFs. A gesture scroll + // begin has been bubbled but the target has sent back a gesture scroll + // event ack which didn't consume any scroll delta, and so another level + // of bubbling is needed. This requires a GestureScrollEnd be sent to the + // last view, which will no longer be the scroll target. + if (bubbling_gesture_scroll_target_.target) + SendGestureScrollEnd(bubbling_gesture_scroll_target_.target, event); + else + first_bubbling_scroll_target_.target = target_view; + + bubbling_gesture_scroll_target_.target = target_view; + } else { // !(event.GetType() == blink::WebInputEvent::kGestureScrollBegin) + if (!bubbling_gesture_scroll_target_.target) { + // The GestureScrollBegin event is not bubbled, don't bubble the rest of + // the scroll events. + return; + } + } + + bubbling_gesture_scroll_target_.target->ProcessGestureEvent(event, + latency_info); + if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd || + event.GetType() == blink::WebInputEvent::kGestureFlingStart) { + first_bubbling_scroll_target_.target = nullptr; + bubbling_gesture_scroll_target_.target = nullptr; + } + + return; + } + + DCHECK(!target_view->wheel_scroll_latching_enabled()); + // If target_view is already set up for bubbled scrolls, we forward // the event to the current scroll target without further consideration. if (target_view == first_bubbling_scroll_target_.target) {
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc index 9584fe7..ded5ede 100644 --- a/content/browser/renderer_host/render_widget_host_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -645,6 +645,13 @@ host_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack)); } + void SendScrollBeginAckIfneeded(InputEventAckState ack_result) { + if (wheel_scroll_latching_enabled_) { + // GSB events are blocking, send the ack. + SendInputEventACK(WebInputEvent::kGestureScrollBegin, ack_result); + } + } + double GetNextSimulatedEventTimeSeconds() { last_simulated_event_time_seconds_ += simulated_event_time_delta_seconds_; return last_simulated_event_time_seconds_; @@ -1543,6 +1550,7 @@ // Mouse drag generates touch move, cancels tap and starts scroll. SimulateMouseEvent(WebInputEvent::kMouseMove, 10, 30, 0, true); EXPECT_EQ(WebInputEvent::kTouchMove, host_->acked_touch_event_type()); + SendScrollBeginAckIfneeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ( "GestureTapCancel GestureScrollBegin TouchScrollStarted " "GestureScrollUpdate", @@ -1602,6 +1610,7 @@ SimulateMouseEvent(WebInputEvent::kMouseMove, 10, 100, 0, true); EXPECT_EQ(WebInputEvent::kTouchMove, host_->acked_touch_event_type()); + SendScrollBeginAckIfneeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ( "GestureTapCancel GestureScrollBegin TouchScrollStarted " "GestureScrollUpdate", @@ -1656,6 +1665,7 @@ // Scroll. SimulateMouseEvent(WebInputEvent::kMouseMove, 10, 30, 0, true); EXPECT_EQ(WebInputEvent::kTouchMove, host_->acked_touch_event_type()); + SendScrollBeginAckIfneeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ( "GestureTapCancel GestureScrollBegin TouchScrollStarted " "GestureScrollUpdate", @@ -1919,6 +1929,7 @@ // Tests RWHI::ForwardGestureEvent(). SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfneeded(INPUT_EVENT_ACK_STATE_CONSUMED); CheckLatencyInfoComponentInMessage(process_, GetLatencyComponentId(), WebInputEvent::kGestureScrollBegin);
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index 5c5848c..8f29608d 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -948,6 +948,13 @@ // We explicitly invoke SetUp to allow gesture debounce customization. void SetUp() override {} + void SendScrollBeginAckIfNeeded(InputEventAckState ack_result) { + if (wheel_scroll_latching_enabled_) { + // GSB events are blocking, send the ack. + SendInputEventACK(WebInputEvent::kGestureScrollBegin, ack_result); + } + } + protected: void SetUpOverscrollEnvironmentWithDebounce(int debounce_interval_in_ms) { SetUpOverscrollEnvironmentImpl(debounce_interval_in_ms); @@ -1197,19 +1204,38 @@ EXPECT_EQ(WebInputEvent::kGestureScrollBegin, event->GetType()); } - // The second message is GestureScrollUpdate. - if (InputMsg_HandleInputEvent::Read(sink_->GetMessageAt(1), ¶ms)) { + size_t gesture_scroll_update_index, first_sent_wheel_index, + last_sent_wheel_index; + if (wheel_scroll_latching_enabled_) { + // Blocking GSB event is sent, GSU will be generated but not sent + // waiting for GSB's ack. Enqueued wheel events will be sent. Finally + // GSU will be sent after GSB's ack. + gesture_scroll_update_index = expected_message_count - 1; + first_sent_wheel_index = 1; + last_sent_wheel_index = expected_message_count - 2; + } else { + // Non-blocking GSB event is sent, GSU event will be sent after GSB's + // immediate ack, then enqueued wheel events will be sent. + gesture_scroll_update_index = 1; + first_sent_wheel_index = 2; + last_sent_wheel_index = expected_message_count - 1; + } + + // Check GestureScrollUpdate. + if (InputMsg_HandleInputEvent::Read( + sink_->GetMessageAt(gesture_scroll_update_index), ¶ms)) { event = std::get<0>(params); EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, event->GetType()); } - for (size_t i = 2; i < expected_message_count; i++) { - // The last messages are the queued MouseWheel event(s). + // Check wheel events. + for (size_t i = first_sent_wheel_index; i <= last_sent_wheel_index; i++) { if (InputMsg_HandleInputEvent::Read(sink_->GetMessageAt(i), ¶ms)) { event = std::get<0>(params); EXPECT_EQ(WebInputEvent::kMouseWheel, event->GetType()); } } + } else { // !is_first_ack expected_message_count = enqueued_wheel_event_count ? 2 : 1; size_t scroll_update_index = 0; @@ -1879,6 +1905,8 @@ const WebGestureEvent* gesture_event = static_cast<const WebGestureEvent*>(input_event); EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); + SendInputEventACK(WebInputEvent::kGestureScrollBegin, + INPUT_EVENT_ACK_STATE_CONSUMED); input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); gesture_event = static_cast<const WebGestureEvent*>(input_event); @@ -1951,6 +1979,8 @@ const WebGestureEvent* gesture_event = static_cast<const WebGestureEvent*>(input_event); EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); + SendInputEventACK(WebInputEvent::kGestureScrollBegin, + INPUT_EVENT_ACK_STATE_CONSUMED); input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); gesture_event = static_cast<const WebGestureEvent*>(input_event); @@ -2017,6 +2047,8 @@ const WebGestureEvent* gesture_event = static_cast<const WebGestureEvent*>(input_event); EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); + SendInputEventACK(WebInputEvent::kGestureScrollBegin, + INPUT_EVENT_ACK_STATE_CONSUMED); input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); gesture_event = static_cast<const WebGestureEvent*>(input_event); @@ -3825,17 +3857,21 @@ // Receive ACK the first wheel event as not processed. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 1); - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { + SendInputEventACK(WebInputEvent::kGestureScrollUpdate, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + } else { + // Don't send an ack for the first event since the two GSUs are coalesced + // while waiting for the blocking ack of GSB to get sent. + } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(true); - } else { + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { ExpectGestureScrollEndForWheelScrolling(false); SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -3902,17 +3938,21 @@ // Receive ACK the first wheel event as not processed. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 2); - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { + SendInputEventACK(WebInputEvent::kGestureScrollUpdate, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + } else { + // Don't send an ack for the first event since the two GSUs are coalesced + // while waiting for the blocking ack of GSB to get sent. + } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(true); - } else { + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { ExpectGestureScrollEndForWheelScrolling(false); // Receive ACK for the second (coalesced) event as not processed. This will // start a back navigation. However, this will also cause the queued next @@ -3998,6 +4038,7 @@ // Receive ACK the first wheel event as processed. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 2); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); @@ -4020,11 +4061,10 @@ EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - // The first and second GSU events are coalesced. This is the ack for the - // coalesced event. Since it is the first GSU, the ack should be consumed. + // The GSU events are coalesced. This is the ack for the coalesced event. + // Since it is the first GSU, the ack should be consumed. SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_CONSUMED); - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(true); } else { SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -4032,10 +4072,10 @@ SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); + SendInputEventACK(WebInputEvent::kGestureScrollUpdate, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); } - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); if (wheel_scrolling_mode_ == kAsyncWheelEvents) { SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); ExpectGestureScrollEndAfterNonBlockingMouseWheelACK(); @@ -4076,6 +4116,7 @@ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, @@ -4229,6 +4270,7 @@ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, @@ -4288,6 +4330,7 @@ // event filter. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureFlingStartEvent(0.f, 0.1f, blink::kWebGestureDeviceTouchpad); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -4322,6 +4365,7 @@ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, @@ -4384,6 +4428,7 @@ // event filter. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureFlingStartEvent(10.f, 0.f, blink::kWebGestureDeviceTouchpad); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -4415,6 +4460,7 @@ // overscroll navigation. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(300, -5, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -4438,6 +4484,7 @@ overscroll_delegate()->Reset(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(-300, -5, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -4461,6 +4508,7 @@ SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); @@ -4513,6 +4561,7 @@ SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(10, 0, 0); // Start scrolling on content. ACK both events as being processed. @@ -4544,6 +4593,7 @@ // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); // Send update events. @@ -4603,6 +4653,7 @@ // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); // Send update events. @@ -4667,6 +4718,7 @@ SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SimulateGestureScrollUpdateEvent(20, 0, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, @@ -4766,6 +4818,7 @@ // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); // The scroll begin event will have received a synthetic ack from the input // router. @@ -4807,6 +4860,7 @@ // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -4850,6 +4904,7 @@ // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); // Send update events and receive ack as not consumed. @@ -4890,6 +4945,7 @@ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, @@ -4989,18 +5045,22 @@ // Receive ACK the first wheel event as not processed. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 1); - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { + SendInputEventACK(WebInputEvent::kGestureScrollUpdate, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + } else { + // Don't send an ack for the first event since the two GSUs are coalesced + // while waiting for the blocking ack of GSB to get sent. + } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(true); - } else { + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { ExpectGestureScrollEndForWheelScrolling(false); // Receive ACK for the second (coalesced) event as not processed. This will // start an overcroll gesture. @@ -5039,6 +5099,7 @@ // Now try with gestures. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(300, -5, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -5108,15 +5169,20 @@ // The first wheel event is consumed. Dispatches the queued wheel event. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 1); - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_CONSUMED); - EXPECT_TRUE(ScrollStateIsContentScrolling()); - - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(true); + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { + SendInputEventACK(WebInputEvent::kGestureScrollUpdate, + INPUT_EVENT_ACK_STATE_CONSUMED); + EXPECT_TRUE(ScrollStateIsContentScrolling()); } else { + // Don't send an ack for the first event since the two GSUs are coalesced + // while waiting for the blocking ack of GSB to get sent. + EXPECT_TRUE(ScrollStateIsUnknown()); + } + + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { ExpectGestureScrollEndForWheelScrolling(false); // The second wheel event is consumed. SendInputEventACK(WebInputEvent::kMouseWheel, @@ -5145,6 +5211,7 @@ // but it should still reset the overscroll controller state. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureFlingStartEvent(0.f, 0.f, blink::kWebGestureDeviceTouchpad); EXPECT_TRUE(ScrollStateIsUnknown()); // ScrollBegin will be queued events. @@ -5176,16 +5243,20 @@ // yet, since enough hasn't been scrolled. SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); ExpectGestureScrollEventsAfterMouseWheelACK(true, 1); - SendInputEventACK(WebInputEvent::kGestureScrollUpdate, - INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { + SendInputEventACK(WebInputEvent::kGestureScrollUpdate, + INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + } else { + // Don't send an ack for the first event since the two GSUs are coalesced + // while waiting for the blocking ack of GSB to get sent. + } EXPECT_TRUE(ScrollStateIsUnknown()); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(true); - } else { + if (wheel_scrolling_mode_ != kAsyncWheelEvents) { ExpectGestureScrollEndForWheelScrolling(false); SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -5215,6 +5286,7 @@ EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureFlingStartEvent(0.f, 0.f, blink::kWebGestureDeviceTouchpad); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -5243,6 +5315,7 @@ // the host. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(300, -5, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -5268,6 +5341,7 @@ // after the threshold. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(300, -5, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -5491,6 +5565,7 @@ WebMouseWheelEvent::kPhaseBegan); // sent directly SendInputEventACK(WebInputEvent::kMouseWheel, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); @@ -5504,6 +5579,7 @@ // Scroll gesture. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureScrollUpdateEvent(-30, -5, 0); SendInputEventACK(WebInputEvent::kGestureScrollUpdate, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); @@ -5541,6 +5617,7 @@ EXPECT_EQ(-5.f, overscroll_delta_y()); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); + SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); SimulateGestureFlingStartEvent(0.f, 0.1f, blink::kWebGestureDeviceTouchpad); EXPECT_EQ(0.f, overscroll_delta_x()); EXPECT_EQ(0.f, overscroll_delta_y());
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm index eaeffae..cd5e5117 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -1377,7 +1377,8 @@ std::unique_ptr<IPC::Message> response1( new InputHostMsg_HandleInputEvent_ACK(0, unhandled_ack)); host->OnMessageReceived(*response1); - ASSERT_EQ(2U, process_host->sink().message_count()); + // Only wheel event ack exists since GSB event is blocking. + ASSERT_EQ(1U, process_host->sink().message_count()); process_host->sink().ClearMessages(); // Send a wheel event with phaseEnded. When wheel scroll latching is enabled @@ -1423,7 +1424,8 @@ std::unique_ptr<IPC::Message> response1( new InputHostMsg_HandleInputEvent_ACK(0, unhandled_ack)); host->OnMessageReceived(*response1); - ASSERT_EQ(2U, process_host->sink().message_count()); + // Only wheel event ack exists since GSB event is blocking. + ASSERT_EQ(1U, process_host->sink().message_count()); process_host->sink().ClearMessages(); // Send a wheel event with phaseEnded. When wheel scroll latching is enabled @@ -1479,7 +1481,8 @@ std::unique_ptr<IPC::Message> response1( new InputHostMsg_HandleInputEvent_ACK(0, unhandled_ack)); host->OnMessageReceived(*response1); - ASSERT_EQ(2U, process_host->sink().message_count()); + // Only wheel event ack exists since GSB event is blocking. + ASSERT_EQ(1U, process_host->sink().message_count()); process_host->sink().ClearMessages(); // Send a wheel event with phaseEnded. When wheel scroll latching is enabled
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc index 06d182f..8b283c5 100644 --- a/content/browser/service_worker/service_worker_url_request_job.cc +++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -58,6 +58,16 @@ namespace { +net::URLRequestStatus ServiceWorkerResponseErrorToNetStatus( + blink::WebServiceWorkerResponseError error) { + if (error == blink::kWebServiceWorkerResponseErrorDataPipeCreationFailed) { + return net::URLRequestStatus::FromError(net::ERR_INSUFFICIENT_RESOURCES); + } + + // TODO(falken): Add more mapping to net errors. + return net::URLRequestStatus::FromError(net::ERR_FAILED); +} + net::NetLogEventType RequestJobResultToNetEventType( ServiceWorkerMetrics::URLRequestJobResult result) { using n = net::NetLogEventType; @@ -708,8 +718,7 @@ // error. if (response.status_code == 0) { RecordStatusZeroResponseError(response.error); - NotifyStartError( - net::URLRequestStatus(net::URLRequestStatus::FAILED, net::ERR_FAILED)); + NotifyStartError(ServiceWorkerResponseErrorToNetStatus(response.error)); return; }
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 2b93965..ee5c40f 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -93,6 +93,7 @@ #include "ui/events/base_event_utils.h" #include "ui/events/event.h" #include "ui/events/event_utils.h" +#include "ui/events/gesture_detection/gesture_configuration.h" #include "ui/gfx/geometry/point.h" #include "ui/latency/latency_info.h" #include "ui/native_theme/native_theme_features.h" @@ -1086,6 +1087,7 @@ scale_factor)); scroll_event.delta_x = 0.0f; scroll_event.delta_y = -30.0f; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; rwhv_root->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); filter->Wait(); @@ -1113,14 +1115,23 @@ FrameTreeNode* child_iframe_node = root->child_at(0); + RenderWidgetHost* child_rwh = + child_iframe_node->current_frame_host()->GetRenderWidgetHost(); + + RenderWidgetHostViewBase* child_rwhv = + static_cast<RenderWidgetHostViewBase*>(child_rwh->GetView()); + std::unique_ptr<InputEventAckWaiter> gesture_fling_start_ack_observer = base::MakeUnique<InputEventAckWaiter>( blink::WebInputEvent::kGestureFlingStart); - root->current_frame_host()->GetRenderWidgetHost()->AddInputEventObserver( - gesture_fling_start_ack_observer.get()); - - RenderWidgetHost* child_rwh = - child_iframe_node->current_frame_host()->GetRenderWidgetHost(); + if (child_rwhv->wheel_scroll_latching_enabled()) { + // If wheel scroll latching is enabled, the fling start won't bubble since + // its corresponding GSB hasn't bubbled. + child_rwh->AddInputEventObserver(gesture_fling_start_ack_observer.get()); + } else { + root->current_frame_host()->GetRenderWidgetHost()->AddInputEventObserver( + gesture_fling_start_ack_observer.get()); + } WaitForChildFrameSurfaceReady(child_iframe_node->current_frame_host()); @@ -1169,6 +1180,8 @@ // Test that scrolling a nested out-of-process iframe bubbles unused scroll // delta to a parent frame. IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, ScrollBubblingFromOOPIFTest) { + ui::GestureConfiguration::GetInstance()->set_scroll_debounce_interval_in_ms( + 0); GURL main_url(embedded_test_server()->GetURL( "a.com", "/cross_site_iframe_factory.html?a(b)")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -1243,12 +1256,25 @@ scroll_event.SetPositionInWidget(1, 1); scroll_event.delta_x = 0.0f; scroll_event.delta_y = -5.0f; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; // Set has_precise_scroll_deltas to keep these events off the animated scroll // pathways, which currently break this test. // https://bugs.chromium.org/p/chromium/issues/detail?id=710513 scroll_event.has_precise_scrolling_deltas = true; rwhv_parent->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); + if (rwhv_parent->wheel_scroll_latching_enabled()) { + // When scroll latching is enabled the event router sends wheel events of a + // single scroll sequence to the target under the first wheel event. Send a + // wheel end event to the current target view before sending a wheel event + // to a different one. + scroll_event.delta_y = 0.0f; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseEnded; + scroll_event.dispatch_type = + blink::WebInputEvent::DispatchType::kEventNonBlocking; + rwhv_parent->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); + } + // Ensure that the view position is propagated to the child properly. filter->Wait(); update_rect = filter->last_rect(); @@ -1260,6 +1286,8 @@ // The upscroll exceeds the amount that the frame was initially scrolled // down to account for rounding. scroll_event.delta_y = 6.0f; + scroll_event.dispatch_type = blink::WebInputEvent::DispatchType::kBlocking; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; rwhv_nested->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); filter->Wait(); @@ -1278,6 +1306,18 @@ update_rect = filter->last_rect(); } + if (rwhv_parent->wheel_scroll_latching_enabled()) { + // When scroll latching is enabled the event router sends wheel events of a + // single scroll sequence to the target under the first wheel event. Send a + // wheel end event to the current target view before sending a wheel event + // to a different one. + scroll_event.delta_y = 0.0f; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseEnded; + scroll_event.dispatch_type = + blink::WebInputEvent::DispatchType::kEventNonBlocking; + rwhv_nested->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); + } + filter->Reset(); // Once we've sent a wheel to the nested iframe that we expect to turn into // a bubbling scroll, we need to delay to make sure the GestureScrollBegin @@ -1291,8 +1331,22 @@ // Scroll the parent down again in order to test scroll bubbling from // gestures. scroll_event.delta_y = -5.0f; + scroll_event.dispatch_type = blink::WebInputEvent::DispatchType::kBlocking; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; rwhv_parent->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); + if (rwhv_parent->wheel_scroll_latching_enabled()) { + // When scroll latching is enabled the event router sends wheel events of a + // single scroll sequence to the target under the first wheel event. Send a + // wheel end event to the current target view before sending a wheel event + // to a different one. + scroll_event.delta_y = 0.0f; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseEnded; + scroll_event.dispatch_type = + blink::WebInputEvent::DispatchType::kEventNonBlocking; + rwhv_parent->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); + } + // Ensure ensuing offset change is received, and then reset the filter. filter->Wait(); filter->Reset(); @@ -1306,6 +1360,8 @@ gesture_event.source_device = blink::kWebGestureDeviceTouchpad; gesture_event.x = 1; gesture_event.y = 1; + gesture_event.data.scroll_begin.delta_x_hint = 0.0f; + gesture_event.data.scroll_begin.delta_y_hint = 6.0f; rwhv_nested->GetRenderWidgetHost()->ForwardGestureEvent(gesture_event); gesture_event.SetType(blink::WebGestureEvent::kGestureScrollUpdate); @@ -1334,6 +1390,8 @@ // not propagate to the parent (see https://crbug.com/621624). filter->Reset(); scroll_event.delta_y = -5.0f; + scroll_event.dispatch_type = blink::WebInputEvent::DispatchType::kBlocking; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseBegan; rwhv_nested->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); // It isn't possible to busy loop waiting on the renderer here because we // are explicitly testing that something does *not* happen. This creates a @@ -5849,8 +5907,8 @@ } // namespace anonymous -// Flaky under Linux and Tsan. https://crbug.com/592320 -#if defined(THREAD_SANITIZER) || defined(OS_LINUX) +// Flaky under TSan. https://crbug.com/592320 +#if defined(THREAD_SANITIZER) #define MAYBE_SubframeGestureEventRouting DISABLED_SubframeGestureEventRouting #else #define MAYBE_SubframeGestureEventRouting SubframeGestureEventRouting
diff --git a/content/browser/site_per_process_mac_browsertest.mm b/content/browser/site_per_process_mac_browsertest.mm index 5cae49a..20a1de4 100644 --- a/content/browser/site_per_process_mac_browsertest.mm +++ b/content/browser/site_per_process_mac_browsertest.mm
@@ -222,12 +222,16 @@ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseNone; child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); - // End of non-momentum scrolling. - scroll_event.delta_y = 0.0f; - scroll_event.phase = blink::WebMouseWheelEvent::kPhaseEnded; - scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseNone; - child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); - gesture_scroll_end_ack_observer->Wait(); + // If wheel scroll latching is enabled, no wheel event with phase ended will + // be sent before a wheel event with momentum phase began. + if (!child_rwhv->wheel_scroll_latching_enabled()) { + // End of non-momentum scrolling. + scroll_event.delta_y = 0.0f; + scroll_event.phase = blink::WebMouseWheelEvent::kPhaseEnded; + scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseNone; + child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo()); + gesture_scroll_end_ack_observer->Wait(); + } gesture_scroll_begin_ack_observer->Reset(); gesture_scroll_end_ack_observer->Reset();
diff --git a/content/renderer/input/input_event_filter_unittest.cc b/content/renderer/input/input_event_filter_unittest.cc index 1437126..1bee1ab 100644 --- a/content/renderer/input/input_event_filter_unittest.cc +++ b/content/renderer/input/input_event_filter_unittest.cc
@@ -46,7 +46,8 @@ bool ShouldBlockEventStream(const blink::WebInputEvent& event) { return ui::WebInputEventTraits::ShouldBlockEventStream( event, - base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents)); + base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents), + base::FeatureList::IsEnabled(features::kTouchpadAndWheelScrollLatching)); } class MainThreadEventQueueTest;
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc index bb0e63e..c4401340 100644 --- a/content/renderer/render_widget_unittest.cc +++ b/content/renderer/render_widget_unittest.cc
@@ -50,7 +50,8 @@ bool ShouldBlockEventStream(const blink::WebInputEvent& event) { return ui::WebInputEventTraits::ShouldBlockEventStream( event, - base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents)); + base::FeatureList::IsEnabled(features::kRafAlignedTouchInputEvents), + base::FeatureList::IsEnabled(features::kTouchpadAndWheelScrollLatching)); } class MockWebWidget : public blink::WebWidget {
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index c939a50..f88d4d3 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -991,12 +991,11 @@ blink::mojom::ServiceWorkerStreamCallbackPtr callback_ptr; body_as_stream->callback_request = mojo::MakeRequest(&callback_ptr); body_as_stream->stream = web_body_as_stream->DrainStreamDataPipe(); + DCHECK(body_as_stream->stream.is_valid()); web_body_as_stream->SetListener( base::MakeUnique<StreamHandleListener>(std::move(callback_ptr))); - // Temporary CHECK to debug https://crbug.com/734978. - CHECK(body_as_stream->stream.is_valid()); response_callback->OnResponseStream( response, std::move(body_as_stream), base::Time::FromDoubleT(event_dispatch_time));
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py index 4cfc06a..2f5f3cf 100755 --- a/content/test/gpu/generate_buildbot_json.py +++ b/content/test/gpu/generate_buildbot_json.py
@@ -1119,14 +1119,11 @@ 'gpu': '10de:104a', 'os': 'Windows-2008ServerR2-SP1' }, - # Temporarily disable AMD deqp ES3 tests due to issues with the log - # size causing out-of-memory errors in the recipe engine. - # crbug.com/713196 # AMD Win 7 - #{ - # 'gpu': '1002:6613', - # 'os': 'Windows-2008ServerR2-SP1' - #} + { + 'gpu': '1002:6613', + 'os': 'Windows-2008ServerR2-SP1' + } ], } ],
diff --git a/ios/chrome/app/resources/BUILD.gn b/ios/chrome/app/resources/BUILD.gn index 5a1f813..0834a77 100644 --- a/ios/chrome/app/resources/BUILD.gn +++ b/ios/chrome/app/resources/BUILD.gn
@@ -91,22 +91,6 @@ ] } -bundle_data("quick_action_icons") { - sources = [ - "quick_action_new_incognito_tab@2x.png", - "quick_action_new_incognito_tab@3x.png", - "quick_action_new_tab@2x.png", - "quick_action_new_tab@3x.png", - "quick_action_qr_scanner@2x.png", - "quick_action_qr_scanner@3x.png", - "quick_action_voice_search@2x.png", - "quick_action_voice_search@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -} - imageset("launchscreen_app_logo") { sources = [ "launchscreen_images.xcassets/launchscreen_app_logo.imageset/Contents.json", @@ -151,3 +135,44 @@ ios_packed_resources_target, ] } + +imageset("quick_action_new_incognito_tab") { + sources = [ + "quick_action_new_incognito_tab.imageset/Contents.json", + "quick_action_new_incognito_tab.imageset/quick_action_new_incognito_tab@2x.png", + "quick_action_new_incognito_tab.imageset/quick_action_new_incognito_tab@3x.png", + ] +} + +imageset("quick_action_new_tab") { + sources = [ + "quick_action_new_tab.imageset/Contents.json", + "quick_action_new_tab.imageset/quick_action_new_tab@2x.png", + "quick_action_new_tab.imageset/quick_action_new_tab@3x.png", + ] +} + +imageset("quick_action_qr_scanner") { + sources = [ + "quick_action_qr_scanner.imageset/Contents.json", + "quick_action_qr_scanner.imageset/quick_action_qr_scanner@2x.png", + "quick_action_qr_scanner.imageset/quick_action_qr_scanner@3x.png", + ] +} + +imageset("quick_action_voice_search") { + sources = [ + "quick_action_voice_search.imageset/Contents.json", + "quick_action_voice_search.imageset/quick_action_voice_search@2x.png", + "quick_action_voice_search.imageset/quick_action_voice_search@3x.png", + ] +} + +group("quick_action_icons") { + public_deps = [ + ":quick_action_new_incognito_tab", + ":quick_action_new_tab", + ":quick_action_qr_scanner", + ":quick_action_voice_search", + ] +}
diff --git a/ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/Contents.json b/ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/Contents.json new file mode 100644 index 0000000..37661b4 --- /dev/null +++ b/ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/Contents.json
@@ -0,0 +1,18 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "2x", + "filename": "quick_action_new_incognito_tab@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "quick_action_new_incognito_tab@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/app/resources/quick_action_new_incognito_tab@2x.png b/ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/quick_action_new_incognito_tab@2x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_new_incognito_tab@2x.png rename to ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/quick_action_new_incognito_tab@2x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_new_incognito_tab@3x.png b/ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/quick_action_new_incognito_tab@3x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_new_incognito_tab@3x.png rename to ios/chrome/app/resources/quick_action_new_incognito_tab.imageset/quick_action_new_incognito_tab@3x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_new_tab.imageset/Contents.json b/ios/chrome/app/resources/quick_action_new_tab.imageset/Contents.json new file mode 100644 index 0000000..284873ef --- /dev/null +++ b/ios/chrome/app/resources/quick_action_new_tab.imageset/Contents.json
@@ -0,0 +1,18 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "2x", + "filename": "quick_action_new_tab@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "quick_action_new_tab@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/app/resources/quick_action_new_tab@2x.png b/ios/chrome/app/resources/quick_action_new_tab.imageset/quick_action_new_tab@2x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_new_tab@2x.png rename to ios/chrome/app/resources/quick_action_new_tab.imageset/quick_action_new_tab@2x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_new_tab@3x.png b/ios/chrome/app/resources/quick_action_new_tab.imageset/quick_action_new_tab@3x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_new_tab@3x.png rename to ios/chrome/app/resources/quick_action_new_tab.imageset/quick_action_new_tab@3x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_qr_scanner.imageset/Contents.json b/ios/chrome/app/resources/quick_action_qr_scanner.imageset/Contents.json new file mode 100644 index 0000000..6184966d --- /dev/null +++ b/ios/chrome/app/resources/quick_action_qr_scanner.imageset/Contents.json
@@ -0,0 +1,18 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "2x", + "filename": "quick_action_qr_scanner@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "quick_action_qr_scanner@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/app/resources/quick_action_qr_scanner@2x.png b/ios/chrome/app/resources/quick_action_qr_scanner.imageset/quick_action_qr_scanner@2x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_qr_scanner@2x.png rename to ios/chrome/app/resources/quick_action_qr_scanner.imageset/quick_action_qr_scanner@2x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_qr_scanner@3x.png b/ios/chrome/app/resources/quick_action_qr_scanner.imageset/quick_action_qr_scanner@3x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_qr_scanner@3x.png rename to ios/chrome/app/resources/quick_action_qr_scanner.imageset/quick_action_qr_scanner@3x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_voice_search.imageset/Contents.json b/ios/chrome/app/resources/quick_action_voice_search.imageset/Contents.json new file mode 100644 index 0000000..230147f --- /dev/null +++ b/ios/chrome/app/resources/quick_action_voice_search.imageset/Contents.json
@@ -0,0 +1,18 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "2x", + "filename": "quick_action_voice_search@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "quick_action_voice_search@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/app/resources/quick_action_voice_search@2x.png b/ios/chrome/app/resources/quick_action_voice_search.imageset/quick_action_voice_search@2x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_voice_search@2x.png rename to ios/chrome/app/resources/quick_action_voice_search.imageset/quick_action_voice_search@2x.png Binary files differ
diff --git a/ios/chrome/app/resources/quick_action_voice_search@3x.png b/ios/chrome/app/resources/quick_action_voice_search.imageset/quick_action_voice_search@3x.png similarity index 100% rename from ios/chrome/app/resources/quick_action_voice_search@3x.png rename to ios/chrome/app/resources/quick_action_voice_search.imageset/quick_action_voice_search@3x.png Binary files differ
diff --git a/ios/chrome/app/safe_mode/BUILD.gn b/ios/chrome/app/safe_mode/BUILD.gn index d1b9a4a..fa95210 100644 --- a/ios/chrome/app/safe_mode/BUILD.gn +++ b/ios/chrome/app/safe_mode/BUILD.gn
@@ -2,17 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -bundle_data("resources") { - sources = [ - "resources/fatal_error.png", - "resources/fatal_error@2x.png", - "resources/fatal_error@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -} - source_set("safe_mode") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ @@ -23,7 +12,7 @@ ] deps = [ - ":resources", + "resources:fatal_error", "//base", "//ios/chrome/app", "//ios/chrome/app/strings",
diff --git a/ios/chrome/app/safe_mode/resources/BUILD.gn b/ios/chrome/app/safe_mode/resources/BUILD.gn new file mode 100644 index 0000000..53abdd25 --- /dev/null +++ b/ios/chrome/app/safe_mode/resources/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("fatal_error") { + sources = [ + "fatal_error.imageset/Contents.json", + "fatal_error.imageset/fatal_error.png", + "fatal_error.imageset/fatal_error@2x.png", + "fatal_error.imageset/fatal_error@3x.png", + ] +}
diff --git a/ios/chrome/app/safe_mode/resources/fatal_error.imageset/Contents.json b/ios/chrome/app/safe_mode/resources/fatal_error.imageset/Contents.json new file mode 100644 index 0000000..7e2e742 --- /dev/null +++ b/ios/chrome/app/safe_mode/resources/fatal_error.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "fatal_error.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "fatal_error@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "fatal_error@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/app/safe_mode/resources/fatal_error.png b/ios/chrome/app/safe_mode/resources/fatal_error.imageset/fatal_error.png similarity index 100% rename from ios/chrome/app/safe_mode/resources/fatal_error.png rename to ios/chrome/app/safe_mode/resources/fatal_error.imageset/fatal_error.png Binary files differ
diff --git a/ios/chrome/app/safe_mode/resources/fatal_error@2x.png b/ios/chrome/app/safe_mode/resources/fatal_error.imageset/fatal_error@2x.png similarity index 100% rename from ios/chrome/app/safe_mode/resources/fatal_error@2x.png rename to ios/chrome/app/safe_mode/resources/fatal_error.imageset/fatal_error@2x.png Binary files differ
diff --git a/ios/chrome/app/safe_mode/resources/fatal_error@3x.png b/ios/chrome/app/safe_mode/resources/fatal_error.imageset/fatal_error@3x.png similarity index 100% rename from ios/chrome/app/safe_mode/resources/fatal_error@3x.png rename to ios/chrome/app/safe_mode/resources/fatal_error.imageset/fatal_error@3x.png Binary files differ
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index d6b878c..64310782 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1218,6 +1218,12 @@ <message name="IDS_IOS_SHOW_PASSWORD_VIEW_USERNAME" desc="Label indicating that the text displayed below is the username to which a saved password corresponds. The password is displayed in the same view, but under a diferent label. [Length: 20em] [iOS only]"> Username </message> + <message name="IDS_IOS_CANCEL_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to cancel deletion of a stored password. [Length: one line] [iOS only]"> + Cancel + </message> + <message name="IDS_IOS_CONFIRM_PASSWORD_DELETION" desc="Label of a confirmation dialogue button which allows the user to confirm deletion of a stored password. [Length: one line] [iOS only]"> + Delete Saved Password + </message> <message name="IDS_IOS_SIGNED_IN_ACCOUNTS_VIEW_OK_BUTTON" desc="The title of the OK button of the Signed In Accounts view [iOS only] [20em]"> OK, Got It </message>
diff --git a/ios/chrome/browser/content_suggestions/BUILD.gn b/ios/chrome/browser/content_suggestions/BUILD.gn index 30b6ff1..2a96b02 100644 --- a/ios/chrome/browser/content_suggestions/BUILD.gn +++ b/ios/chrome/browser/content_suggestions/BUILD.gn
@@ -12,6 +12,8 @@ "content_suggestions_category_wrapper.mm", "content_suggestions_coordinator.h", "content_suggestions_coordinator.mm", + "content_suggestions_favicon_mediator.h", + "content_suggestions_favicon_mediator.mm", "content_suggestions_header_controller.h", "content_suggestions_header_controller.mm", "content_suggestions_header_controller_delegate.h",
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.h b/ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.h new file mode 100644 index 0000000..928c59a4 --- /dev/null +++ b/ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.h
@@ -0,0 +1,50 @@ +// 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 IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_FAVICON_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_FAVICON_MEDIATOR_H_ + +#import <UIKit/UIKit.h> + +namespace favicon { +class LargeIconService; +} +namespace ntp_snippets { +class Category; +class ContentSuggestionsService; +} + +@protocol ContentSuggestionsDataSink; +@class ContentSuggestionsItem; +@class ContentSuggestionsMostVisitedItem; + +// Mediator handling the fetching of the favicon for all ContentSuggestions +// items. +@interface ContentSuggestionsFaviconMediator : NSObject + +// Initializes the mediator with the |contentService| used to fetch the image of +// the suggested items and the |largeIconService| to fetch the favicon locally. +- (nullable instancetype) +initWithContentService: + (nonnull ntp_snippets::ContentSuggestionsService*)contentService + largeIconService:(nonnull favicon::LargeIconService*)largeIconService + NS_DESIGNATED_INITIALIZER; + +- (nullable instancetype)init NS_UNAVAILABLE; + +// The data sink which should be notified of the changes in the items. +@property(nonatomic, weak, nullable) id<ContentSuggestionsDataSink> dataSink; + +// Fetches the favicon for this |item|. +- (void)fetchFaviconForMostVisited: + (nonnull ContentSuggestionsMostVisitedItem*)item; + +// Fetches the favicon attributes for this |item| living in |category|. Also +// fetches the favicon image from the ContentSuggestionsService. +- (void)fetchFaviconForSuggestions:(nonnull ContentSuggestionsItem*)item + inCategory:(ntp_snippets::Category)category; + +@end + +#endif // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_FAVICON_MEDIATOR_H_
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.mm new file mode 100644 index 0000000..83dec59f --- /dev/null +++ b/ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.mm
@@ -0,0 +1,152 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.h" + +#include "base/mac/bind_objc_block.h" +#include "components/favicon/core/large_icon_service.h" +#include "components/ntp_snippets/category.h" +#include "components/ntp_snippets/content_suggestions_service.h" +#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h" +#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h" +#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h" +#import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestion_identifier.h" +#import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" +#import "ios/chrome/browser/ui/favicon/favicon_attributes_provider.h" +#include "ui/gfx/image/image.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// Size of the favicon returned by the provider for the suggestions items. +const CGFloat kSuggestionsFaviconSize = 16; +// Size of the favicon returned by the provider for the most visited items. +const CGFloat kMostVisitedFaviconSize = 48; +// Size below which the provider returns a colored tile instead of an image. +const CGFloat kMostVisitedFaviconMinimalSize = 32; + +} // namespace + +@interface ContentSuggestionsFaviconMediator () + +// The ContentSuggestionsService, serving suggestions. +@property(nonatomic, assign) + ntp_snippets::ContentSuggestionsService* contentService; + +// FaviconAttributesProvider to fetch the favicon for the most visited tiles. +@property(nonatomic, nullable, strong) + FaviconAttributesProvider* mostVisitedAttributesProvider; +// FaviconAttributesProvider to fetch the favicon for the suggestions. +@property(nonatomic, nullable, strong) + FaviconAttributesProvider* suggestionsAttributesProvider; + +@end + +@implementation ContentSuggestionsFaviconMediator + +@synthesize mostVisitedAttributesProvider = _mostVisitedAttributesProvider; +@synthesize suggestionsAttributesProvider = _suggestionsAttributesProvider; +@synthesize contentService = _contentService; +@synthesize dataSink = _dataSink; + +#pragma mark - Public. + +- (instancetype) +initWithContentService:(ntp_snippets::ContentSuggestionsService*)contentService + largeIconService:(favicon::LargeIconService*)largeIconService { + self = [super init]; + if (self) { + _mostVisitedAttributesProvider = [[FaviconAttributesProvider alloc] + initWithFaviconSize:kMostVisitedFaviconSize + minFaviconSize:kMostVisitedFaviconMinimalSize + largeIconService:largeIconService]; + _suggestionsAttributesProvider = [[FaviconAttributesProvider alloc] + initWithFaviconSize:kSuggestionsFaviconSize + minFaviconSize:1 + largeIconService:largeIconService]; + _contentService = contentService; + } + return self; +} + +- (void)fetchFaviconForMostVisited:(ContentSuggestionsMostVisitedItem*)item { + __weak ContentSuggestionsFaviconMediator* weakSelf = self; + __weak ContentSuggestionsMostVisitedItem* weakItem = item; + + void (^completion)(FaviconAttributes*) = ^(FaviconAttributes* attributes) { + ContentSuggestionsFaviconMediator* strongSelf = weakSelf; + ContentSuggestionsMostVisitedItem* strongItem = weakItem; + if (!strongSelf || !strongItem) + return; + + strongItem.attributes = attributes; + [strongSelf.dataSink itemHasChanged:strongItem]; + }; + + [self.mostVisitedAttributesProvider fetchFaviconAttributesForURL:item.URL + completion:completion]; +} + +- (void)fetchFaviconForSuggestions:(ContentSuggestionsItem*)item + inCategory:(ntp_snippets::Category)category { + __weak ContentSuggestionsFaviconMediator* weakSelf = self; + __weak ContentSuggestionsItem* weakItem = item; + + void (^completion)(FaviconAttributes*) = ^(FaviconAttributes* attributes) { + ContentSuggestionsFaviconMediator* strongSelf = weakSelf; + ContentSuggestionsItem* strongItem = weakItem; + if (!strongSelf || !strongItem) + return; + + strongItem.attributes = attributes; + [strongSelf.dataSink itemHasChanged:strongItem]; + [strongSelf fetchFaviconImageForSuggestions:strongItem inCategory:category]; + }; + + GURL URL = item.URL; + if (category.IsKnownCategory(ntp_snippets::KnownCategories::READING_LIST)) { + URL = item.faviconURL; + } + + [self.suggestionsAttributesProvider fetchFaviconAttributesForURL:URL + completion:completion]; +} + +#pragma mark - Private. + +// Fetches the favicon image for the |item|, based on the +// ContentSuggestionsService. +- (void)fetchFaviconImageForSuggestions:(ContentSuggestionsItem*)item + inCategory:(ntp_snippets::Category)category { + if (!category.IsKnownCategory(ntp_snippets::KnownCategories::ARTICLES)) { + // TODO(crbug.com/721266): remove this guard once the choice to download the + // favicon from the google server is done in the provider. + return; + } + + __weak ContentSuggestionsFaviconMediator* weakSelf = self; + __weak ContentSuggestionsItem* weakItem = item; + void (^imageCallback)(const gfx::Image&) = ^(const gfx::Image& image) { + ContentSuggestionsFaviconMediator* strongSelf = weakSelf; + ContentSuggestionsItem* strongItem = weakItem; + if (!strongSelf || !strongItem || image.IsEmpty()) + return; + + strongItem.attributes = + [FaviconAttributes attributesWithImage:[image.ToUIImage() copy]]; + [strongSelf.dataSink itemHasChanged:strongItem]; + }; + + ntp_snippets::ContentSuggestion::ID identifier = + ntp_snippets::ContentSuggestion::ID( + category, item.suggestionIdentifier.IDInSection); + self.contentService->FetchSuggestionFavicon( + identifier, /* minimum_size_in_pixel = */ 1, kSuggestionsFaviconSize, + base::BindBlockArc(imageCallback)); +} + +@end
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm index 966f4be..d4cb659 100644 --- a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm +++ b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
@@ -9,7 +9,6 @@ #include "base/memory/ptr_util.h" #include "base/optional.h" #include "base/strings/sys_string_conversions.h" -#include "components/favicon/core/large_icon_service.h" #include "components/ntp_snippets/category.h" #include "components/ntp_snippets/category_info.h" #include "components/ntp_snippets/content_suggestion.h" @@ -17,6 +16,7 @@ #include "components/ntp_tiles/ntp_tile.h" #include "ios/chrome/browser/application_context.h" #import "ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.h" +#import "ios/chrome/browser/content_suggestions/content_suggestions_favicon_mediator.h" #import "ios/chrome/browser/content_suggestions/content_suggestions_header_provider.h" #import "ios/chrome/browser/content_suggestions/content_suggestions_service_bridge_observer.h" #import "ios/chrome/browser/content_suggestions/mediator_util.h" @@ -30,12 +30,10 @@ #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_image_fetcher.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestion_identifier.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" -#import "ios/chrome/browser/ui/favicon/favicon_attributes_provider.h" #import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" #include "ios/public/provider/chrome/browser/images/branded_image_provider.h" #include "ios/public/provider/chrome/browser/images/whats_new_icon.h" -#include "ui/gfx/image/image.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -45,8 +43,6 @@ using CSCollectionViewItem = CollectionViewItem<SuggestedContent>; -// Size of the favicon returned by the provider. -const CGFloat kDefaultFaviconSize = 48; // Maximum number of most visited tiles fetched. const NSInteger kMaxNumMostVisitedTiles = 8; @@ -85,9 +81,8 @@ NSMutableDictionary<ContentSuggestionsCategoryWrapper*, ContentSuggestionsSectionInformation*>* sectionInformationByCategory; -// FaviconAttributesProvider to fetch the favicon for the suggestions. -@property(nonatomic, nullable, strong) - FaviconAttributesProvider* attributesProvider; +// Mediator fetching the favicons for the items. +@property(nonatomic, strong) ContentSuggestionsFaviconMediator* faviconMediator; @end @@ -101,9 +96,9 @@ @synthesize contentService = _contentService; @synthesize dataSink = _dataSink; @synthesize sectionInformationByCategory = _sectionInformationByCategory; -@synthesize attributesProvider = _attributesProvider; @synthesize commandHandler = _commandHandler; @synthesize headerProvider = _headerProvider; +@synthesize faviconMediator = _faviconMediator; #pragma mark - Public @@ -118,10 +113,9 @@ base::MakeUnique<ContentSuggestionsServiceBridge>(self, contentService); _contentService = contentService; _sectionInformationByCategory = [[NSMutableDictionary alloc] init]; - _attributesProvider = [[FaviconAttributesProvider alloc] - initWithFaviconSize:kDefaultFaviconSize - minFaviconSize:1 - largeIconService:largeIconService]; + _faviconMediator = [[ContentSuggestionsFaviconMediator alloc] + initWithContentService:contentService + largeIconService:largeIconService]; _mostVisitedSectionInfo = MostVisitedSectionInformation(); _logoSectionInfo = LogoSectionInformation(); @@ -153,6 +147,11 @@ return _notificationPromo.get(); } +- (void)setDataSink:(id<ContentSuggestionsDataSink>)dataSink { + _dataSink = dataSink; + self.faviconMediator.dataSink = dataSink; +} + #pragma mark - ContentSuggestionsDataSource - (NSArray<ContentSuggestionsSectionInformation*>*)sectionsInfo { @@ -283,54 +282,6 @@ } } -- (void)fetchFaviconAttributesForItem:(CSCollectionViewItem*)item - completion:(void (^)(FaviconAttributes*))completion { - ContentSuggestionsSectionInformation* sectionInfo = - item.suggestionIdentifier.sectionInfo; - GURL url; - if ([self isRelatedToContentSuggestionsService:sectionInfo]) { - ContentSuggestionsItem* suggestionItem = - base::mac::ObjCCast<ContentSuggestionsItem>(item); - url = suggestionItem.URL; - } else if (sectionInfo == self.mostVisitedSectionInfo) { - ContentSuggestionsMostVisitedItem* mostVisited = - base::mac::ObjCCast<ContentSuggestionsMostVisitedItem>(item); - url = mostVisited.URL; - } - [self.attributesProvider fetchFaviconAttributesForURL:url - completion:completion]; -} - -- (void)fetchFaviconImageForItem:(CSCollectionViewItem*)item - completion:(void (^)(UIImage*))completion { - ContentSuggestionsSectionInformation* sectionInfo = - item.suggestionIdentifier.sectionInfo; - if (![self isRelatedToContentSuggestionsService:sectionInfo]) { - return; - } - ContentSuggestionsItem* suggestionItem = - base::mac::ObjCCast<ContentSuggestionsItem>(item); - ntp_snippets::Category category = - [[self categoryWrapperForSectionInfo:sectionInfo] category]; - if (!category.IsKnownCategory(ntp_snippets::KnownCategories::ARTICLES)) { - // TODO(crbug.com/721266): remove this guard once the choice to download the - // favicon from the google server is done in the provider. - return; - } - void (^imageCallback)(const gfx::Image&) = ^(const gfx::Image& image) { - if (!image.IsEmpty()) { - completion([image.ToUIImage() copy]); - } - }; - - ntp_snippets::ContentSuggestion::ID identifier = - ntp_snippets::ContentSuggestion::ID( - category, suggestionItem.suggestionIdentifier.IDInSection); - self.contentService->FetchSuggestionFavicon( - identifier, /* minimum_size_in_pixel = */ 1, kDefaultFaviconSize, - base::BindBlockArc(imageCallback)); -} - - (void)dismissSuggestion:(ContentSuggestionIdentifier*)suggestionIdentifier { ContentSuggestionsCategoryWrapper* categoryWrapper = [self categoryWrapperForSectionInfo:suggestionIdentifier.sectionInfo]; @@ -424,8 +375,10 @@ (const ntp_tiles::NTPTilesVector&)mostVisited { self.freshMostVisitedItems = [NSMutableArray array]; for (const ntp_tiles::NTPTile& tile : mostVisited) { - [self.freshMostVisitedItems - addObject:ConvertNTPTile(tile, self.mostVisitedSectionInfo)]; + ContentSuggestionsMostVisitedItem* item = + ConvertNTPTile(tile, self.mostVisitedSectionInfo); + [self.faviconMediator fetchFaviconForMostVisited:item]; + [self.freshMostVisitedItems addObject:item]; } if ([self.mostVisitedItems count] > 0) { @@ -445,7 +398,7 @@ - (void)onIconMadeAvailable:(const GURL&)siteURL { for (ContentSuggestionsMostVisitedItem* item in self.mostVisitedItems) { if (item.URL == siteURL) { - [self.dataSink faviconAvailableForItem:item]; + [self.faviconMediator fetchFaviconForMostVisited:item]; return; } } @@ -472,8 +425,10 @@ ContentSuggestionsSectionInformation* sectionInfo = self.sectionInformationByCategory[categoryWrapper]; for (auto& contentSuggestion : suggestions) { - CSCollectionViewItem* suggestion = + ContentSuggestionsItem* suggestion = ConvertSuggestion(contentSuggestion, sectionInfo, category); + [self.faviconMediator fetchFaviconForSuggestions:suggestion + inCategory:category]; [itemArray addObject:suggestion]; }
diff --git a/ios/chrome/browser/content_suggestions/mediator_util.h b/ios/chrome/browser/content_suggestions/mediator_util.h index f75d042..a510206 100644 --- a/ios/chrome/browser/content_suggestions/mediator_util.h +++ b/ios/chrome/browser/content_suggestions/mediator_util.h
@@ -11,7 +11,6 @@ #include "components/ntp_snippets/content_suggestion.h" #include "components/ntp_snippets/status.h" #include "components/ntp_tiles/ntp_tile.h" -#import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" namespace ntp_snippets { @@ -20,6 +19,7 @@ @class CollectionViewItem; @class ContentSuggestionsCategoryWrapper; +@class ContentSuggestionsItem; @class ContentSuggestionsMostVisitedItem; // TODO(crbug.com/701275): Once base::BindBlock supports the move semantics, @@ -37,7 +37,7 @@ ntp_snippets::Category category); // Converts a ntp_snippets::ContentSuggestion to a CollectionViewItem. -CollectionViewItem<SuggestedContent>* ConvertSuggestion( +ContentSuggestionsItem* ConvertSuggestion( const ntp_snippets::ContentSuggestion& contentSuggestion, ContentSuggestionsSectionInformation* sectionInfo, ntp_snippets::Category category);
diff --git a/ios/chrome/browser/content_suggestions/mediator_util.mm b/ios/chrome/browser/content_suggestions/mediator_util.mm index 53638396..e1bbab7 100644 --- a/ios/chrome/browser/content_suggestions/mediator_util.mm +++ b/ios/chrome/browser/content_suggestions/mediator_util.mm
@@ -43,7 +43,7 @@ return ContentSuggestionsSectionUnknown; } -CollectionViewItem<SuggestedContent>* ConvertSuggestion( +ContentSuggestionsItem* ConvertSuggestion( const ntp_snippets::ContentSuggestion& contentSuggestion, ContentSuggestionsSectionInformation* sectionInfo, ntp_snippets::Category category) { @@ -65,6 +65,8 @@ if (category.IsKnownCategory(ntp_snippets::KnownCategories::READING_LIST)) { suggestion.availableOffline = contentSuggestion.reading_list_suggestion_extra()->distilled; + suggestion.faviconURL = + contentSuggestion.reading_list_suggestion_extra()->favicon_page_url; } if (category.IsKnownCategory(ntp_snippets::KnownCategories::ARTICLES)) { suggestion.hasImage = YES;
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn index 0599d48..50730cf 100644 --- a/ios/chrome/browser/ui/authentication/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -4,33 +4,6 @@ import("//build/config/chrome_build.gni") -bundle_data("resources") { - sources = [ - "resources/signin_confirmation_more.png", - "resources/signin_confirmation_more@2x.png", - "resources/signin_confirmation_more@3x.png", - "resources/signin_promo_close_gray.png", - "resources/signin_promo_close_gray@2x.png", - "resources/signin_promo_close_gray@3x.png", - ] - if (is_chrome_branded) { - sources += [ - "resources/signin_promo_logo_chrome_color.png", - "resources/signin_promo_logo_chrome_color@2x.png", - "resources/signin_promo_logo_chrome_color@3x.png", - ] - } else { - sources += [ - "resources/signin_promo_logo_chromium_color.png", - "resources/signin_promo_logo_chromium_color@2x.png", - "resources/signin_promo_logo_chromium_color@3x.png", - ] - } - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -} - source_set("authentication") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ @@ -57,7 +30,8 @@ deps = [ ":authentication_arc", ":authentication_ui", - ":resources", + "resources:signin_confirmation_more", + "resources:signin_promo_close_gray", "//base", "//components/google/core/browser", "//components/infobars/core", @@ -93,6 +67,11 @@ "//ui/gfx", "//url", ] + if (is_chrome_branded) { + deps += [ "resources:signin_promo_logo_chrome_color" ] + } else { + deps += [ "resources:signin_promo_logo_chromium_color" ] + } libs = [ "CoreGraphics.framework", "QuartzCore.framework",
diff --git a/ios/chrome/browser/ui/authentication/resources/BUILD.gn b/ios/chrome/browser/ui/authentication/resources/BUILD.gn new file mode 100644 index 0000000..9ef1905 --- /dev/null +++ b/ios/chrome/browser/ui/authentication/resources/BUILD.gn
@@ -0,0 +1,41 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("signin_confirmation_more") { + sources = [ + "signin_confirmation_more.imageset/Contents.json", + "signin_confirmation_more.imageset/signin_confirmation_more.png", + "signin_confirmation_more.imageset/signin_confirmation_more@2x.png", + "signin_confirmation_more.imageset/signin_confirmation_more@3x.png", + ] +} + +imageset("signin_promo_close_gray") { + sources = [ + "signin_promo_close_gray.imageset/Contents.json", + "signin_promo_close_gray.imageset/signin_promo_close_gray.png", + "signin_promo_close_gray.imageset/signin_promo_close_gray@2x.png", + "signin_promo_close_gray.imageset/signin_promo_close_gray@3x.png", + ] +} + +imageset("signin_promo_logo_chrome_color") { + sources = [ + "signin_promo_logo_chrome_color.imageset/Contents.json", + "signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color.png", + "signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color@2x.png", + "signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color@3x.png", + ] +} + +imageset("signin_promo_logo_chromium_color") { + sources = [ + "signin_promo_logo_chromium_color.imageset/Contents.json", + "signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color.png", + "signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color@2x.png", + "signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/Contents.json b/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/Contents.json new file mode 100644 index 0000000..e8195e8 --- /dev/null +++ b/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "signin_confirmation_more.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "signin_confirmation_more@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "signin_confirmation_more@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.png b/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/signin_confirmation_more.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.png rename to ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/signin_confirmation_more.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more@2x.png b/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/signin_confirmation_more@2x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_confirmation_more@2x.png rename to ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/signin_confirmation_more@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more@3x.png b/ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/signin_confirmation_more@3x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_confirmation_more@3x.png rename to ios/chrome/browser/ui/authentication/resources/signin_confirmation_more.imageset/signin_confirmation_more@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/Contents.json b/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/Contents.json new file mode 100644 index 0000000..608f3cf --- /dev/null +++ b/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "signin_promo_close_gray.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "signin_promo_close_gray@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "signin_promo_close_gray@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/signin_promo_close_gray.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/signin_promo_close_gray.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray@2x.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/signin_promo_close_gray@2x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray@2x.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/signin_promo_close_gray@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray@3x.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/signin_promo_close_gray@3x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray@3x.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_close_gray.imageset/signin_promo_close_gray@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/Contents.json b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/Contents.json new file mode 100644 index 0000000..e745e6b --- /dev/null +++ b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "signin_promo_logo_chrome_color.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "signin_promo_logo_chrome_color@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "signin_promo_logo_chrome_color@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color@2x.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color@2x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color@2x.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color@3x.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color@3x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color@3x.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chrome_color.imageset/signin_promo_logo_chrome_color@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/Contents.json b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/Contents.json new file mode 100644 index 0000000..09f27e4c --- /dev/null +++ b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "signin_promo_logo_chromium_color.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "signin_promo_logo_chromium_color@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "signin_promo_logo_chromium_color@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color@2x.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color@2x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color@2x.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color@3x.png b/ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color@3x.png similarity index 100% rename from ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color@3x.png rename to ios/chrome/browser/ui/authentication/resources/signin_promo_logo_chromium_color.imageset/signin_promo_logo_chromium_color@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h index 29471f4..d0f0339 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.h
@@ -35,6 +35,10 @@ @property(nonatomic, assign) BOOL hasImage; // Whether the suggestion is available offline. If YES, an icon is displayed. @property(nonatomic, assign) BOOL availableOffline; +// Attributes for favicon. +@property(nonatomic, strong) FaviconAttributes* attributes; +// URL for the favicon, if different of |URL|. +@property(nonatomic, assign) GURL faviconURL; @end
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.mm index 0662dda..81e79a7 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_item.mm
@@ -45,6 +45,7 @@ @synthesize delegate = _delegate; @synthesize imageFetched = _imageFetched; @synthesize attributes = _attributes; +@synthesize faviconURL = _faviconURL; @synthesize hasImage = _hasImage; @synthesize availableOffline = _availableOffline; @synthesize firstTimeWithImage = _firstTimeWithImage;
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h index 97b27d9..7b73994 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_most_visited_item.h
@@ -10,6 +10,7 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" +@class FaviconAttributes; class GURL; // Item containing a Most Visited suggestion. @@ -23,6 +24,8 @@ @property(nonatomic, assign) GURL URL; // Source of the Most Visited tile. @property(nonatomic, assign) ntp_tiles::TileSource source; +// Attributes for favicon. +@property(nonatomic, strong, nullable) FaviconAttributes* attributes; - (ntp_tiles::TileVisualType)tileType;
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm index c27d2ca..26e76851a 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm
@@ -18,7 +18,6 @@ @synthesize text = _text; @synthesize detailText = _detailText; @synthesize suggestionIdentifier = _suggestionIdentifier; -@synthesize attributes = _attributes; @synthesize delegate = _delegate; @synthesize image = _image;
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm index 1f0c2cb2..1c731540 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm +++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm
@@ -34,7 +34,6 @@ @synthesize text = _text; @synthesize delegate = _delegate; @synthesize image = _image; -@synthesize attributes = _attributes; @synthesize suggestionIdentifier = _suggestionIdentifier; - (instancetype)initWithType:(NSInteger)type {
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h b/ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h index 0145854..bc5dfec 100644 --- a/ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h +++ b/ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h
@@ -9,7 +9,6 @@ @class CollectionViewItem; @class ContentSuggestionIdentifier; -@class FaviconAttributes; @protocol SuggestedContent; // Delegate for SuggestedContent. @@ -27,8 +26,6 @@ @property(nonatomic, weak) id<SuggestedContentDelegate> delegate; // Image associated with this content. @property(nonatomic, strong) UIImage* image; -// Attributes for favicon. -@property(nonatomic, strong) FaviconAttributes* attributes; // Identifier for this content. @property(nonatomic, strong) ContentSuggestionIdentifier* suggestionIdentifier;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm index c89d739..563330e8 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_updater.mm
@@ -24,7 +24,6 @@ #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestion_identifier.h" #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestions_section_information.h" -#import "ios/chrome/browser/ui/favicon/favicon_attributes.h" #include "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -259,10 +258,11 @@ reloadSections:[NSIndexSet indexSetWithIndex:section]]; } -- (void)faviconAvailableForItem:(CollectionViewItem<SuggestedContent>*)item { - if ([self.collectionViewController.collectionViewModel hasItem:item]) { - [self fetchFaviconForItem:item]; +- (void)itemHasChanged:(CollectionViewItem<SuggestedContent>*)item { + if (![self.collectionViewController.collectionViewModel hasItem:item]) { + return; } + [self.collectionViewController reconfigureCellsForItems:@[ item ]]; } #pragma mark - Public methods @@ -332,7 +332,6 @@ item.type = type; NSIndexPath* addedIndexPath = [self addItem:item toSectionWithIdentifier:sectionIdentifier]; - [self fetchFaviconForItem:item]; item.delegate = self; [indexPaths addObject:addedIndexPath]; @@ -547,53 +546,6 @@ self.sectionInfoBySectionIdentifier = [[NSMutableDictionary alloc] init]; } -// Fetches the favicon attributes for the |item|. -- (void)fetchFaviconForItem:(CSCollectionViewItem*)item { - __weak ContentSuggestionsCollectionUpdater* weakSelf = self; - __weak CSCollectionViewItem* weakItem = item; - - [self.dataSource - fetchFaviconAttributesForItem:item - completion:^(FaviconAttributes* attributes) { - ContentSuggestionsCollectionUpdater* strongSelf = - weakSelf; - CSCollectionViewItem* strongItem = weakItem; - if (!strongSelf || !strongItem) - return; - - [strongSelf reconfigure:strongItem - withAttributes:attributes]; - - [strongSelf fetchFaviconImageForItem:strongItem]; - }]; -} - -// Fetches the favicon image for the |item|. -- (void)fetchFaviconImageForItem:(CSCollectionViewItem*)item { - __weak ContentSuggestionsCollectionUpdater* weakSelf = self; - __weak CSCollectionViewItem* weakItem = item; - - [self.dataSource - fetchFaviconImageForItem:item - completion:^(UIImage* image) { - [weakSelf reconfigure:weakItem - withAttributes:[FaviconAttributes - attributesWithImage:image]]; - }]; -} - -// Sets the attributes of |item| to |attributes| and reconfigures it. -- (void)reconfigure:(CSCollectionViewItem*)item - withAttributes:(FaviconAttributes*)attributes { - if (!item || !attributes || - ![self.collectionViewController.collectionViewModel hasItem:item]) { - return; - } - - item.attributes = attributes; - [self.collectionViewController reconfigureCellsForItems:@[ item ]]; -} - // Runs the additional action for the section identified by |sectionInfo|. - (void)runAdditionalActionForSection: (ContentSuggestionsSectionInformation*)sectionInfo {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h index 99071cb..4cea736 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h
@@ -36,8 +36,8 @@ // now, removing the current content. - (void)reloadSection:(ContentSuggestionsSectionInformation*)sectionInfo; -// Notifies the Data Sink that a new favicon is available for the |item|. -- (void)faviconAvailableForItem:(CollectionViewItem<SuggestedContent>*)item; +// Notifies the data sink that the |item| has changed. +- (void)itemHasChanged:(CollectionViewItem<SuggestedContent>*)item; @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_source.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_source.h index fb79ddb..9edc511 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_source.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_data_source.h
@@ -37,21 +37,6 @@ // Returns an image updater for the suggestions provided by this data source. - (nullable id<ContentSuggestionsImageFetcher>)imageFetcher; -// Fetches favicon attributes associated with the |item| and calls the -// |completion| block. -- (void)fetchFaviconAttributesForItem: - (nonnull CollectionViewItem<SuggestedContent>*)item - completion: - (void (^_Nonnull)(FaviconAttributes* _Nonnull)) - completion; - -// Fetches the favicon image associated with the |item|. If there is no image -// cached locally and the provider allows it, it tries to download it. The -// |completion| block is only called if an image is found. -- (void) -fetchFaviconImageForItem:(nonnull CollectionViewItem<SuggestedContent>*)item - completion:(void (^_Nonnull)(UIImage* _Nonnull))completion; - // Fetches additional content. All the |knownSuggestions| must come from the // same |sectionInfo|. If the fetch was completed, the given |callback| is // called with the new content.
diff --git a/ios/chrome/browser/ui/contextual_search/BUILD.gn b/ios/chrome/browser/ui/contextual_search/BUILD.gn index 7b4a8e9..89c47527 100644 --- a/ios/chrome/browser/ui/contextual_search/BUILD.gn +++ b/ios/chrome/browser/ui/contextual_search/BUILD.gn
@@ -4,17 +4,6 @@ import("//ios/web/js_compile.gni") -bundle_data("resources") { - sources = [ - "resources/expand_less.png", - "resources/expand_less@2x.png", - "resources/expand_less@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -} - js_compile_unchecked("injected_js") { sources = [ "resources/contextualsearch.js", @@ -68,7 +57,7 @@ ] deps = [ ":injected_js", - ":resources", + "resources:expand_less", "//base", "//components/google/core/browser", "//components/prefs",
diff --git a/ios/chrome/browser/ui/contextual_search/resources/BUILD.gn b/ios/chrome/browser/ui/contextual_search/resources/BUILD.gn new file mode 100644 index 0000000..30af686d --- /dev/null +++ b/ios/chrome/browser/ui/contextual_search/resources/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("expand_less") { + sources = [ + "expand_less.imageset/Contents.json", + "expand_less.imageset/expand_less.png", + "expand_less.imageset/expand_less@2x.png", + "expand_less.imageset/expand_less@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/Contents.json b/ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/Contents.json new file mode 100644 index 0000000..aea7a14d --- /dev/null +++ b/ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "expand_less.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "expand_less@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "expand_less@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/contextual_search/resources/expand_less.png b/ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/expand_less.png similarity index 100% rename from ios/chrome/browser/ui/contextual_search/resources/expand_less.png rename to ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/expand_less.png Binary files differ
diff --git a/ios/chrome/browser/ui/contextual_search/resources/expand_less@2x.png b/ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/expand_less@2x.png similarity index 100% rename from ios/chrome/browser/ui/contextual_search/resources/expand_less@2x.png rename to ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/expand_less@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/contextual_search/resources/expand_less@3x.png b/ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/expand_less@3x.png similarity index 100% rename from ios/chrome/browser/ui/contextual_search/resources/expand_less@3x.png rename to ios/chrome/browser/ui/contextual_search/resources/expand_less.imageset/expand_less@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/BUILD.gn b/ios/chrome/browser/ui/infobars/BUILD.gn index 4655878..d5568ec 100644 --- a/ios/chrome/browser/ui/infobars/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/BUILD.gn
@@ -10,7 +10,11 @@ "infobar_view_delegate.h", ] deps = [ - ":resources", + "resources:infobar_close", + "resources:infobar_downloading", + "resources:infobar_popup_blocker", + "resources:infobar_shadow", + "resources:infobar_warning", "//base", "//base:i18n", "//components/strings", @@ -62,28 +66,3 @@ ] libs = [ "XCTest.framework" ] } - -bundle_data("resources") { - sources = [ - "resources/infobar_close.png", - "resources/infobar_close@2x.png", - "resources/infobar_close@3x.png", - "resources/infobar_downloading.png", - "resources/infobar_downloading@2x.png", - "resources/infobar_downloading@3x.png", - "resources/infobar_popup_blocker.png", - "resources/infobar_popup_blocker@2x.png", - "resources/infobar_popup_blocker@3x.png", - "resources/infobar_shadow.png", - "resources/infobar_shadow@2x.png", - "resources/infobar_update.png", - "resources/infobar_update@2x.png", - "resources/infobar_update@3x.png", - "resources/infobar_warning.png", - "resources/infobar_warning@2x.png", - "resources/infobar_warning@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -}
diff --git a/ios/chrome/browser/ui/infobars/resources/BUILD.gn b/ios/chrome/browser/ui/infobars/resources/BUILD.gn new file mode 100644 index 0000000..37afb860 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/resources/BUILD.gn
@@ -0,0 +1,49 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("infobar_warning") { + sources = [ + "infobar_warning.imageset/Contents.json", + "infobar_warning.imageset/infobar_warning.png", + "infobar_warning.imageset/infobar_warning@2x.png", + "infobar_warning.imageset/infobar_warning@3x.png", + ] +} + +imageset("infobar_downloading") { + sources = [ + "infobar_downloading.imageset/Contents.json", + "infobar_downloading.imageset/infobar_downloading.png", + "infobar_downloading.imageset/infobar_downloading@2x.png", + "infobar_downloading.imageset/infobar_downloading@3x.png", + ] +} + +imageset("infobar_shadow") { + sources = [ + "infobar_shadow.imageset/Contents.json", + "infobar_shadow.imageset/infobar_shadow.png", + "infobar_shadow.imageset/infobar_shadow@2x.png", + ] +} + +imageset("infobar_close") { + sources = [ + "infobar_close.imageset/Contents.json", + "infobar_close.imageset/infobar_close.png", + "infobar_close.imageset/infobar_close@2x.png", + "infobar_close.imageset/infobar_close@3x.png", + ] +} + +imageset("infobar_popup_blocker") { + sources = [ + "infobar_popup_blocker.imageset/Contents.json", + "infobar_popup_blocker.imageset/infobar_popup_blocker.png", + "infobar_popup_blocker.imageset/infobar_popup_blocker@2x.png", + "infobar_popup_blocker.imageset/infobar_popup_blocker@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/Contents.json b/ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/Contents.json new file mode 100644 index 0000000..2deb035b --- /dev/null +++ b/ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "infobar_close.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "infobar_close@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "infobar_close@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_close.png b/ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/infobar_close.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_close.png rename to ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/infobar_close.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_close@2x.png b/ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/infobar_close@2x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_close@2x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/infobar_close@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_close@3x.png b/ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/infobar_close@3x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_close@3x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_close.imageset/infobar_close@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/Contents.json b/ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/Contents.json new file mode 100644 index 0000000..d5c679e --- /dev/null +++ b/ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "infobar_downloading.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "infobar_downloading@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "infobar_downloading@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_downloading.png b/ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/infobar_downloading.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_downloading.png rename to ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/infobar_downloading.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_downloading@2x.png b/ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/infobar_downloading@2x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_downloading@2x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/infobar_downloading@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_downloading@3x.png b/ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/infobar_downloading@3x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_downloading@3x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_downloading.imageset/infobar_downloading@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/Contents.json b/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/Contents.json new file mode 100644 index 0000000..e8b15a1d --- /dev/null +++ b/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "infobar_popup_blocker.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "infobar_popup_blocker@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "infobar_popup_blocker@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.png b/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/infobar_popup_blocker.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.png rename to ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/infobar_popup_blocker.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker@2x.png b/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/infobar_popup_blocker@2x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker@2x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/infobar_popup_blocker@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker@3x.png b/ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/infobar_popup_blocker@3x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker@3x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_popup_blocker.imageset/infobar_popup_blocker@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/Contents.json b/ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/Contents.json new file mode 100644 index 0000000..21f76d4 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/Contents.json
@@ -0,0 +1,18 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "infobar_shadow.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "infobar_shadow@2x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_shadow.png b/ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/infobar_shadow.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_shadow.png rename to ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/infobar_shadow.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_shadow@2x.png b/ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/infobar_shadow@2x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_shadow@2x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_shadow.imageset/infobar_shadow@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/Contents.json b/ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/Contents.json new file mode 100644 index 0000000..8143b07 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "infobar_warning.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "infobar_warning@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "infobar_warning@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_warning.png b/ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/infobar_warning.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_warning.png rename to ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/infobar_warning.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_warning@2x.png b/ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/infobar_warning@2x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_warning@2x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/infobar_warning@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_warning@3x.png b/ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/infobar_warning@3x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_warning@3x.png rename to ios/chrome/browser/ui/infobars/resources/infobar_warning.imageset/infobar_warning@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn index 49a1a5a..13b54b5 100644 --- a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn +++ b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
@@ -2,32 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -bundle_data("resources") { - sources = [ - "resources/ptr_close.png", - "resources/ptr_close@2x.png", - "resources/ptr_close@3x.png", - "resources/ptr_close_active.png", - "resources/ptr_close_active@2x.png", - "resources/ptr_close_active@3x.png", - "resources/ptr_new_tab.png", - "resources/ptr_new_tab@2x.png", - "resources/ptr_new_tab@3x.png", - "resources/ptr_new_tab_active.png", - "resources/ptr_new_tab_active@2x.png", - "resources/ptr_new_tab_active@3x.png", - "resources/ptr_reload.png", - "resources/ptr_reload@2x.png", - "resources/ptr_reload@3x.png", - "resources/ptr_reload_active.png", - "resources/ptr_reload_active@2x.png", - "resources/ptr_reload_active@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -} - source_set("overscroll_actions") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ @@ -39,7 +13,12 @@ "overscroll_actions_view.mm", ] deps = [ - ":resources", + "resources:ptr_close", + "resources:ptr_close_active", + "resources:ptr_new_tab", + "resources:ptr_new_tab_active", + "resources:ptr_reload", + "resources:ptr_reload_active", "//base", "//ios/chrome/app/theme", "//ios/chrome/browser/ui",
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/BUILD.gn b/ios/chrome/browser/ui/overscroll_actions/resources/BUILD.gn new file mode 100644 index 0000000..0f9e6b50 --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/BUILD.gn
@@ -0,0 +1,59 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("ptr_reload_active") { + sources = [ + "ptr_reload_active.imageset/Contents.json", + "ptr_reload_active.imageset/ptr_reload_active.png", + "ptr_reload_active.imageset/ptr_reload_active@2x.png", + "ptr_reload_active.imageset/ptr_reload_active@3x.png", + ] +} + +imageset("ptr_close_active") { + sources = [ + "ptr_close_active.imageset/Contents.json", + "ptr_close_active.imageset/ptr_close_active.png", + "ptr_close_active.imageset/ptr_close_active@2x.png", + "ptr_close_active.imageset/ptr_close_active@3x.png", + ] +} + +imageset("ptr_close") { + sources = [ + "ptr_close.imageset/Contents.json", + "ptr_close.imageset/ptr_close.png", + "ptr_close.imageset/ptr_close@2x.png", + "ptr_close.imageset/ptr_close@3x.png", + ] +} + +imageset("ptr_new_tab") { + sources = [ + "ptr_new_tab.imageset/Contents.json", + "ptr_new_tab.imageset/ptr_new_tab.png", + "ptr_new_tab.imageset/ptr_new_tab@2x.png", + "ptr_new_tab.imageset/ptr_new_tab@3x.png", + ] +} + +imageset("ptr_reload") { + sources = [ + "ptr_reload.imageset/Contents.json", + "ptr_reload.imageset/ptr_reload.png", + "ptr_reload.imageset/ptr_reload@2x.png", + "ptr_reload.imageset/ptr_reload@3x.png", + ] +} + +imageset("ptr_new_tab_active") { + sources = [ + "ptr_new_tab_active.imageset/Contents.json", + "ptr_new_tab_active.imageset/ptr_new_tab_active.png", + "ptr_new_tab_active.imageset/ptr_new_tab_active@2x.png", + "ptr_new_tab_active.imageset/ptr_new_tab_active@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/Contents.json b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/Contents.json new file mode 100644 index 0000000..92a9828 --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "ptr_close.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "ptr_close@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "ptr_close@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/ptr_close.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/ptr_close.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close@2x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/ptr_close@2x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_close@2x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/ptr_close@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close@3x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/ptr_close@3x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_close@3x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_close.imageset/ptr_close@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/Contents.json b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/Contents.json new file mode 100644 index 0000000..c33aa8a --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "ptr_close_active.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "ptr_close_active@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "ptr_close_active@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/ptr_close_active.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/ptr_close_active.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active@2x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/ptr_close_active@2x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active@2x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/ptr_close_active@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active@3x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/ptr_close_active@3x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active@3x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_close_active.imageset/ptr_close_active@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/Contents.json b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/Contents.json new file mode 100644 index 0000000..bb27e7ab --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "ptr_new_tab.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "ptr_new_tab@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "ptr_new_tab@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/ptr_new_tab.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/ptr_new_tab.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab@2x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/ptr_new_tab@2x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab@2x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/ptr_new_tab@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab@3x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/ptr_new_tab@3x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab@3x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab.imageset/ptr_new_tab@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/Contents.json b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/Contents.json new file mode 100644 index 0000000..d8a3665 --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "ptr_new_tab_active.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "ptr_new_tab_active@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "ptr_new_tab_active@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/ptr_new_tab_active.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/ptr_new_tab_active.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active@2x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/ptr_new_tab_active@2x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active@2x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/ptr_new_tab_active@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active@3x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/ptr_new_tab_active@3x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active@3x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_new_tab_active.imageset/ptr_new_tab_active@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/Contents.json b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/Contents.json new file mode 100644 index 0000000..6941791e --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "ptr_reload.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "ptr_reload@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "ptr_reload@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/ptr_reload.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/ptr_reload.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload@2x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/ptr_reload@2x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload@2x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/ptr_reload@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload@3x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/ptr_reload@3x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload@3x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload.imageset/ptr_reload@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/Contents.json b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/Contents.json new file mode 100644 index 0000000..9445628 --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "ptr_reload_active.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "ptr_reload_active@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "ptr_reload_active@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/ptr_reload_active.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/ptr_reload_active.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active@2x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/ptr_reload_active@2x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active@2x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/ptr_reload_active@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active@3x.png b/ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/ptr_reload_active@3x.png similarity index 100% rename from ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active@3x.png rename to ios/chrome/browser/ui/overscroll_actions/resources/ptr_reload_active.imageset/ptr_reload_active@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.h b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.h index 65ab388..3797cb9 100644 --- a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.h +++ b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.h
@@ -6,6 +6,7 @@ #define IOS_CHROME_BROWSER_UI_PAYMENTS_CREDIT_CARD_EDIT_COORDINATOR_H_ #import "ios/chrome/browser/chrome_coordinator.h" +#import "ios/chrome/browser/ui/payments/address_edit_coordinator.h" #import "ios/chrome/browser/ui/payments/billing_address_selection_coordinator.h" #import "ios/chrome/browser/ui/payments/payment_request_edit_view_controller.h" @@ -38,9 +39,10 @@ // controller. This view controller will be presented by the view controller // provided in the initializer. @interface CreditCardEditCoordinator - : ChromeCoordinator<PaymentRequestEditViewControllerDelegate, - PaymentRequestEditViewControllerValidator, - BillingAddressSelectionCoordinatorDelegate> + : ChromeCoordinator<AddressEditCoordinatorDelegate, + BillingAddressSelectionCoordinatorDelegate, + PaymentRequestEditViewControllerDelegate, + PaymentRequestEditViewControllerValidator> // The credit card to be edited, if any. This pointer is not owned by this class // and should outlive it.
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 c0160bf..b31867e 100644 --- a/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.mm +++ b/ios/chrome/browser/ui/payments/credit_card_edit_coordinator.mm
@@ -72,6 +72,8 @@ @property(nonatomic, strong) BillingAddressSelectionCoordinator* billingAddressSelectionCoordinator; +@property(nonatomic, strong) AddressEditCoordinator* addressEditCoordinator; + @property(nonatomic, strong) UINavigationController* viewController; @property(nonatomic, strong) @@ -88,6 +90,7 @@ @synthesize delegate = _delegate; @synthesize billingAddressSelectionCoordinator = _billingAddressSelectionCoordinator; +@synthesize addressEditCoordinator = _addressEditCoordinator; @synthesize viewController = _viewController; @synthesize editViewController = _editViewController; @synthesize mediator = _mediator; @@ -124,6 +127,8 @@ [[self.viewController presentingViewController] dismissViewControllerAnimated:YES completion:nil]; + [self.addressEditCoordinator stop]; + self.addressEditCoordinator = nil; [self.billingAddressSelectionCoordinator stop]; self.billingAddressSelectionCoordinator = nil; self.editViewController = nil; @@ -171,15 +176,24 @@ (PaymentRequestEditViewController*)controller didSelectField:(EditorField*)field { if (field.autofillUIType == AutofillUITypeCreditCardBillingAddress) { - self.billingAddressSelectionCoordinator = - [[BillingAddressSelectionCoordinator alloc] - initWithBaseViewController:self.editViewController]; - [self.billingAddressSelectionCoordinator - setPaymentRequest:self.paymentRequest]; - [self.billingAddressSelectionCoordinator - setSelectedBillingProfile:self.mediator.billingProfile]; - [self.billingAddressSelectionCoordinator setDelegate:self]; - [self.billingAddressSelectionCoordinator start]; + if (_paymentRequest->billing_profiles().empty()) { + self.addressEditCoordinator = [[AddressEditCoordinator alloc] + initWithBaseViewController:_viewController]; + [self.addressEditCoordinator setPaymentRequest:_paymentRequest]; + [self.addressEditCoordinator setDelegate:self]; + [self.addressEditCoordinator start]; + return; + } else { + self.billingAddressSelectionCoordinator = + [[BillingAddressSelectionCoordinator alloc] + initWithBaseViewController:self.editViewController]; + [self.billingAddressSelectionCoordinator + setPaymentRequest:self.paymentRequest]; + [self.billingAddressSelectionCoordinator + setSelectedBillingProfile:self.mediator.billingProfile]; + [self.billingAddressSelectionCoordinator setDelegate:self]; + [self.billingAddressSelectionCoordinator start]; + } } } @@ -274,4 +288,24 @@ self.billingAddressSelectionCoordinator = nil; } +#pragma mark - AddressEditCoordinatorDelegate + +- (void)addressEditCoordinator:(AddressEditCoordinator*)coordinator + didFinishEditingAddress:(autofill::AutofillProfile*)address { + // Update view controller's data source with the selection and reload the view + // controller. + DCHECK(address); + [self.mediator setBillingProfile:address]; + [self.editViewController loadModel]; + [self.editViewController.collectionView reloadData]; + + [self.addressEditCoordinator stop]; + self.addressEditCoordinator = nil; +} + +- (void)addressEditCoordinatorDidCancel:(AddressEditCoordinator*)coordinator { + [self.addressEditCoordinator stop]; + self.addressEditCoordinator = nil; +} + @end
diff --git a/ios/chrome/browser/ui/settings/password_details_collection_view_controller.mm b/ios/chrome/browser/ui/settings/password_details_collection_view_controller.mm index a54be123..cd1cd98 100644 --- a/ios/chrome/browser/ui/settings/password_details_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password_details_collection_view_controller.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/ui/settings/password_details_collection_view_controller.h" +#import <UIKit/UIKit.h> + #include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" #include "components/autofill/core/common/password_form.h" @@ -73,10 +75,16 @@ PasswordDetailsItem* _passwordItem; } +// Alert dialogue to confirm deletion of passwords upon pressing the delete +// button. +@property(nonatomic, strong) UIAlertController* deleteConfirmation; + @end @implementation PasswordDetailsCollectionViewController +@synthesize deleteConfirmation = _deleteConfirmation; + - (instancetype) initWithPasswordForm:(autofill::PasswordForm)passwordForm delegate: @@ -384,7 +392,35 @@ } - (void)deletePassword { - [_weakDelegate deletePassword:_passwordForm]; + __weak PasswordDetailsCollectionViewController* weakSelf = self; + + self.deleteConfirmation = [UIAlertController + alertControllerWithTitle:nil + message:nil + preferredStyle:UIAlertControllerStyleActionSheet]; + + UIAlertAction* cancelAction = [UIAlertAction + actionWithTitle:l10n_util::GetNSString(IDS_IOS_CANCEL_PASSWORD_DELETION) + style:UIAlertActionStyleCancel + handler:^(UIAlertAction* action) { + weakSelf.deleteConfirmation = nil; + }]; + [_deleteConfirmation addAction:cancelAction]; + + UIAlertAction* deleteAction = [UIAlertAction + actionWithTitle:l10n_util::GetNSString(IDS_IOS_CONFIRM_PASSWORD_DELETION) + style:UIAlertActionStyleDestructive + handler:^(UIAlertAction* action) { + PasswordDetailsCollectionViewController* strongSelf = weakSelf; + if (!strongSelf) { + return; + } + strongSelf.deleteConfirmation = nil; + [strongSelf->_weakDelegate deletePassword:_passwordForm]; + }]; + [_deleteConfirmation addAction:deleteAction]; + + [self presentViewController:_deleteConfirmation animated:YES completion:nil]; } #pragma mark - UICollectionViewDelegate
diff --git a/ios/chrome/browser/ui/settings/password_details_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password_details_collection_view_controller_unittest.mm index fba37884..3c4f95a 100644 --- a/ios/chrome/browser/ui/settings/password_details_collection_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password_details_collection_view_controller_unittest.mm
@@ -50,16 +50,11 @@ - (void)deletePassword:(const autofill::PasswordForm&)passwordForm; -@property(nonatomic) NSInteger numberOfCallsToDeletePassword; - @end @implementation MockSavePasswordsCollectionViewController -@synthesize numberOfCallsToDeletePassword = _numberOfCallsToDeletePassword; - - (void)deletePassword:(const autofill::PasswordForm&)passwordForm { - ++_numberOfCallsToDeletePassword; } @end @@ -251,12 +246,4 @@ reauthenticationModule_.localizedReasonForAuthentication); } -TEST_F(PasswordDetailsCollectionViewControllerTest, DeletePassword) { - CreateController(); - [controller() collectionView:[controller() collectionView] - didSelectItemAtIndexPath:[NSIndexPath indexPathForRow:kDeleteButtonItem - inSection:kDeleteSection]]; - EXPECT_EQ(1, delegate_.numberOfCallsToDeletePassword); -} - } // namespace
diff --git a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm index fa35b2c..528d4c9 100644 --- a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
@@ -520,6 +520,17 @@ performAction:grey_tap()]; [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; + // Tap the alert's Delete... button to confirm. + [[EarlGrey + selectElementWithMatcher:grey_allOf( + grey_interactable(), + grey_sufficientlyVisible(), + ButtonWithAccessibilityLabel( + l10n_util::GetNSString( + IDS_IOS_CONFIRM_PASSWORD_DELETION)), + nullptr)] performAction:grey_tap()]; + [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; + // Check that the current view is now the list view, by locating the header // of the list of passwords. [[EarlGrey selectElementWithMatcher: @@ -538,4 +549,52 @@ [self clearPasswordStore]; } +// Checks that deleting a password from password details can be cancelled. +- (void)testCancelDeletion { + [self scopedEnablePasswordManagementAndViewingUI]; + + // Save form to be deleted later. + [self saveExamplePasswordForm]; + + [self openPasswordSettings]; + + [[EarlGrey selectElementWithMatcher:Entry(@"https://example.com, user")] + performAction:grey_tap()]; + + // Tap the Delete... button. + [[[EarlGrey selectElementWithMatcher:DeleteButton()] + usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, + kScrollAmount) + onElementWithMatcher:grey_accessibilityID( + @"PasswordDetailsCollectionViewController")] + performAction:grey_tap()]; + [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; + + // Tap the alert's Cancel button to cancel. + [[EarlGrey + selectElementWithMatcher:grey_allOf( + grey_interactable(), + grey_sufficientlyVisible(), + ButtonWithAccessibilityLabel( + l10n_util::GetNSString( + IDS_IOS_CANCEL_PASSWORD_DELETION)), + nullptr)] performAction:grey_tap()]; + [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; + + // Check that the current view is still the detail view, by locating the Copy + // button. + [[EarlGrey selectElementWithMatcher:CopyPasswordButton()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Go back to the list view and verify that the password is still in the + // list. + [self tapBackArrow]; + [[EarlGrey selectElementWithMatcher:Entry(@"https://example.com, user")] + assertWithMatcher:grey_sufficientlyVisible()]; + + [self tapBackArrow]; + [self tapDone]; + [self clearPasswordStore]; +} + @end
diff --git a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm index ed461570..ea84ba0 100644 --- a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller_unittest.mm
@@ -10,19 +10,25 @@ #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" #include "components/autofill/core/common/password_form.h" +#include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/mock_password_store.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" #import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h" +#import "ios/chrome/browser/ui/settings/password_details_collection_view_controller.h" #include "ios/web/public/test/test_web_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -@interface SavePasswordsCollectionViewController (InternalMethods) +using password_manager::MockPasswordStore; + +@interface SavePasswordsCollectionViewController ( + InternalMethods)<PasswordDetailsCollectionViewControllerDelegate> - (void)onGetPasswordStoreResults: (const std::vector<autofill::PasswordForm*>&)result; @end @@ -41,11 +47,18 @@ CollectionViewControllerTest::SetUp(); IOSChromePasswordStoreFactory::GetInstance()->SetTestingFactory( chrome_browser_state_.get(), - &password_manager::BuildPasswordStore< - web::BrowserState, password_manager::MockPasswordStore>); + &password_manager::BuildPasswordStore<web::BrowserState, + MockPasswordStore>); CreateController(); } + MockPasswordStore& GetMockStore() { + return *static_cast<MockPasswordStore*>( + IOSChromePasswordStoreFactory::GetForBrowserState( + chrome_browser_state_.get(), ServiceAccessType::EXPLICIT_ACCESS) + .get()); + } + CollectionViewController* InstantiateController() override { return [[SavePasswordsCollectionViewController alloc] initWithBrowserState:chrome_browser_state_.get()]; @@ -183,4 +196,20 @@ EXPECT_EQ(2, NumberOfSections()); } +TEST_F(SavePasswordsCollectionViewControllerTest, PropagateDeletionToStore) { + SavePasswordsCollectionViewController* save_password_controller = + static_cast<SavePasswordsCollectionViewController*>(controller()); + autofill::PasswordForm form; + form.origin = GURL("http://www.example.com/accounts/LoginAuth"); + form.action = GURL("http://www.example.com/accounts/Login"); + form.username_element = base::ASCIIToUTF16("Email"); + form.username_value = base::ASCIIToUTF16("test@egmail.com"); + form.password_element = base::ASCIIToUTF16("Passwd"); + form.password_value = base::ASCIIToUTF16("test"); + form.signon_realm = "http://www.example.com/"; + form.scheme = autofill::PasswordForm::SCHEME_HTML; + EXPECT_CALL(GetMockStore(), RemoveLogin(form)); + [save_password_controller deletePassword:form]; +} + } // namespace
diff --git a/ios/chrome/browser/ui/tab_switcher/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/BUILD.gn index 5a9a65d..acb9b00 100644 --- a/ios/chrome/browser/ui/tab_switcher/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/BUILD.gn
@@ -2,53 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -bundle_data("resources") { - sources = [ - "resources/tabswitcher_full_history.png", - "resources/tabswitcher_full_history@2x.png", - "resources/tabswitcher_full_history@3x.png", - "resources/tabswitcher_incognito.png", - "resources/tabswitcher_incognito@2x.png", - "resources/tabswitcher_incognito@3x.png", - "resources/tabswitcher_laptop.png", - "resources/tabswitcher_laptop@2x.png", - "resources/tabswitcher_laptop@3x.png", - "resources/tabswitcher_menu.png", - "resources/tabswitcher_menu@2x.png", - "resources/tabswitcher_menu@3x.png", - "resources/tabswitcher_new_tab.png", - "resources/tabswitcher_new_tab@2x.png", - "resources/tabswitcher_new_tab@3x.png", - "resources/tabswitcher_new_tab_fab.png", - "resources/tabswitcher_new_tab_fab@2x.png", - "resources/tabswitcher_new_tab_fab@3x.png", - "resources/tabswitcher_open_tabs.png", - "resources/tabswitcher_open_tabs@2x.png", - "resources/tabswitcher_open_tabs@3x.png", - "resources/tabswitcher_other_devices.png", - "resources/tabswitcher_other_devices@2x.png", - "resources/tabswitcher_other_devices@3x.png", - "resources/tabswitcher_overflow_arrow.png", - "resources/tabswitcher_overflow_arrow@2x.png", - "resources/tabswitcher_overflow_arrow@3x.png", - "resources/tabswitcher_phone.png", - "resources/tabswitcher_phone@2x.png", - "resources/tabswitcher_phone@3x.png", - "resources/tabswitcher_recently_closed.png", - "resources/tabswitcher_recently_closed@2x.png", - "resources/tabswitcher_recently_closed@3x.png", - "resources/tabswitcher_tab_switcher_button.png", - "resources/tabswitcher_tab_switcher_button@2x.png", - "resources/tabswitcher_tab_switcher_button@3x.png", - "resources/tabswitcher_tablet.png", - "resources/tabswitcher_tablet@2x.png", - "resources/tabswitcher_tablet@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -} - source_set("tab_switcher") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ @@ -90,8 +43,20 @@ "tab_switcher_view.mm", ] deps = [ - ":resources", ":utils", + "resources:tabswitcher_full_history", + "resources:tabswitcher_incognito", + "resources:tabswitcher_laptop", + "resources:tabswitcher_menu", + "resources:tabswitcher_new_tab", + "resources:tabswitcher_new_tab_fab", + "resources:tabswitcher_open_tabs", + "resources:tabswitcher_other_devices", + "resources:tabswitcher_overflow_arrow", + "resources:tabswitcher_phone", + "resources:tabswitcher_recently_closed", + "resources:tabswitcher_tab_switcher_button", + "resources:tabswitcher_tablet", "//base", "//components/browser_sync", "//components/sessions",
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/resources/BUILD.gn new file mode 100644 index 0000000..e15b039 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/BUILD.gn
@@ -0,0 +1,122 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("tabswitcher_full_history") { + sources = [ + "tabswitcher_full_history.imageset/Contents.json", + "tabswitcher_full_history.imageset/tabswitcher_full_history.png", + "tabswitcher_full_history.imageset/tabswitcher_full_history@2x.png", + "tabswitcher_full_history.imageset/tabswitcher_full_history@3x.png", + ] +} + +imageset("tabswitcher_incognito") { + sources = [ + "tabswitcher_incognito.imageset/Contents.json", + "tabswitcher_incognito.imageset/tabswitcher_incognito.png", + "tabswitcher_incognito.imageset/tabswitcher_incognito@2x.png", + "tabswitcher_incognito.imageset/tabswitcher_incognito@3x.png", + ] +} + +imageset("tabswitcher_laptop") { + sources = [ + "tabswitcher_laptop.imageset/Contents.json", + "tabswitcher_laptop.imageset/tabswitcher_laptop.png", + "tabswitcher_laptop.imageset/tabswitcher_laptop@2x.png", + "tabswitcher_laptop.imageset/tabswitcher_laptop@3x.png", + ] +} + +imageset("tabswitcher_menu") { + sources = [ + "tabswitcher_menu.imageset/Contents.json", + "tabswitcher_menu.imageset/tabswitcher_menu.png", + "tabswitcher_menu.imageset/tabswitcher_menu@2x.png", + "tabswitcher_menu.imageset/tabswitcher_menu@3x.png", + ] +} + +imageset("tabswitcher_new_tab") { + sources = [ + "tabswitcher_new_tab.imageset/Contents.json", + "tabswitcher_new_tab.imageset/tabswitcher_new_tab.png", + "tabswitcher_new_tab.imageset/tabswitcher_new_tab@2x.png", + "tabswitcher_new_tab.imageset/tabswitcher_new_tab@3x.png", + ] +} + +imageset("tabswitcher_new_tab_fab") { + sources = [ + "tabswitcher_new_tab_fab.imageset/Contents.json", + "tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab.png", + "tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab@2x.png", + "tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab@3x.png", + ] +} + +imageset("tabswitcher_open_tabs") { + sources = [ + "tabswitcher_open_tabs.imageset/Contents.json", + "tabswitcher_open_tabs.imageset/tabswitcher_open_tabs.png", + "tabswitcher_open_tabs.imageset/tabswitcher_open_tabs@2x.png", + "tabswitcher_open_tabs.imageset/tabswitcher_open_tabs@3x.png", + ] +} + +imageset("tabswitcher_other_devices") { + sources = [ + "tabswitcher_other_devices.imageset/Contents.json", + "tabswitcher_other_devices.imageset/tabswitcher_other_devices.png", + "tabswitcher_other_devices.imageset/tabswitcher_other_devices@2x.png", + "tabswitcher_other_devices.imageset/tabswitcher_other_devices@3x.png", + ] +} + +imageset("tabswitcher_overflow_arrow") { + sources = [ + "tabswitcher_overflow_arrow.imageset/Contents.json", + "tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow.png", + "tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow@2x.png", + "tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow@3x.png", + ] +} + +imageset("tabswitcher_phone") { + sources = [ + "tabswitcher_phone.imageset/Contents.json", + "tabswitcher_phone.imageset/tabswitcher_phone.png", + "tabswitcher_phone.imageset/tabswitcher_phone@2x.png", + "tabswitcher_phone.imageset/tabswitcher_phone@3x.png", + ] +} + +imageset("tabswitcher_recently_closed") { + sources = [ + "tabswitcher_recently_closed.imageset/Contents.json", + "tabswitcher_recently_closed.imageset/tabswitcher_recently_closed.png", + "tabswitcher_recently_closed.imageset/tabswitcher_recently_closed@2x.png", + "tabswitcher_recently_closed.imageset/tabswitcher_recently_closed@3x.png", + ] +} + +imageset("tabswitcher_tab_switcher_button") { + sources = [ + "tabswitcher_tab_switcher_button.imageset/Contents.json", + "tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button.png", + "tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button@2x.png", + "tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button@3x.png", + ] +} + +imageset("tabswitcher_tablet") { + sources = [ + "tabswitcher_tablet.imageset/Contents.json", + "tabswitcher_tablet.imageset/tabswitcher_tablet.png", + "tabswitcher_tablet.imageset/tabswitcher_tablet@2x.png", + "tabswitcher_tablet.imageset/tabswitcher_tablet@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/Contents.json new file mode 100644 index 0000000..5d40c23 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_full_history.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_full_history@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_full_history@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/tabswitcher_full_history.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/tabswitcher_full_history.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/tabswitcher_full_history@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/tabswitcher_full_history@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/tabswitcher_full_history@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_full_history.imageset/tabswitcher_full_history@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/Contents.json new file mode 100644 index 0000000..c067dadc --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_incognito.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_incognito@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_incognito@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/tabswitcher_incognito.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/tabswitcher_incognito.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/tabswitcher_incognito@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/tabswitcher_incognito@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/tabswitcher_incognito@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_incognito.imageset/tabswitcher_incognito@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/Contents.json new file mode 100644 index 0000000..3362943 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_laptop.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_laptop@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_laptop@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/tabswitcher_laptop.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/tabswitcher_laptop.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/tabswitcher_laptop@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/tabswitcher_laptop@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/tabswitcher_laptop@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_laptop.imageset/tabswitcher_laptop@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/Contents.json new file mode 100644 index 0000000..7289ac2 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_menu.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_menu@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_menu@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/tabswitcher_menu.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/tabswitcher_menu.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/tabswitcher_menu@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/tabswitcher_menu@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/tabswitcher_menu@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_menu.imageset/tabswitcher_menu@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/Contents.json new file mode 100644 index 0000000..ca669cf --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_new_tab.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_new_tab@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_new_tab@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/tabswitcher_new_tab.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/tabswitcher_new_tab.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/tabswitcher_new_tab@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/tabswitcher_new_tab@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/tabswitcher_new_tab@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab.imageset/tabswitcher_new_tab@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/Contents.json new file mode 100644 index 0000000..89e117e --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_new_tab_fab.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_new_tab_fab@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_new_tab_fab@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_new_tab_fab.imageset/tabswitcher_new_tab_fab@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/Contents.json new file mode 100644 index 0000000..4292079b --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_open_tabs.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_open_tabs@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_open_tabs@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/tabswitcher_open_tabs.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/tabswitcher_open_tabs.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/tabswitcher_open_tabs@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/tabswitcher_open_tabs@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/tabswitcher_open_tabs@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_open_tabs.imageset/tabswitcher_open_tabs@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/Contents.json new file mode 100644 index 0000000..6f09b6dd --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_other_devices.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_other_devices@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_other_devices@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/tabswitcher_other_devices.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/tabswitcher_other_devices.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/tabswitcher_other_devices@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/tabswitcher_other_devices@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/tabswitcher_other_devices@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_other_devices.imageset/tabswitcher_other_devices@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/Contents.json new file mode 100644 index 0000000..b22842e --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_overflow_arrow.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_overflow_arrow@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_overflow_arrow@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_overflow_arrow.imageset/tabswitcher_overflow_arrow@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/Contents.json new file mode 100644 index 0000000..873d386cf --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_phone.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_phone@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_phone@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/tabswitcher_phone.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/tabswitcher_phone.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/tabswitcher_phone@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/tabswitcher_phone@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/tabswitcher_phone@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_phone.imageset/tabswitcher_phone@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/Contents.json new file mode 100644 index 0000000..49aa0c7 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_recently_closed.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_recently_closed@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_recently_closed@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/tabswitcher_recently_closed.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/tabswitcher_recently_closed.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/tabswitcher_recently_closed@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/tabswitcher_recently_closed@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/tabswitcher_recently_closed@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_recently_closed.imageset/tabswitcher_recently_closed@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/Contents.json new file mode 100644 index 0000000..0d023928 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_tab_switcher_button.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_tab_switcher_button@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_tab_switcher_button@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tab_switcher_button.imageset/tabswitcher_tab_switcher_button@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/Contents.json b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/Contents.json new file mode 100644 index 0000000..9e0ac35 --- /dev/null +++ b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "tabswitcher_tablet.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "tabswitcher_tablet@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "tabswitcher_tablet@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/tabswitcher_tablet.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/tabswitcher_tablet.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet@2x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/tabswitcher_tablet@2x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet@2x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/tabswitcher_tablet@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet@3x.png b/ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/tabswitcher_tablet@3x.png similarity index 100% rename from ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet@3x.png rename to ios/chrome/browser/ui/tab_switcher/resources/tabswitcher_tablet.imageset/tabswitcher_tablet@3x.png Binary files differ
diff --git a/ios/chrome/browser/upgrade/BUILD.gn b/ios/chrome/browser/upgrade/BUILD.gn index ae7a744..2c33ed2 100644 --- a/ios/chrome/browser/upgrade/BUILD.gn +++ b/ios/chrome/browser/upgrade/BUILD.gn
@@ -10,13 +10,13 @@ "upgrade_recommended_details.h", ] deps = [ + "resources:infobar_update", "//base", "//components/infobars/core", "//components/version_info", "//ios/chrome/app/strings", "//ios/chrome/browser", "//ios/chrome/browser/ui/commands", - "//ios/chrome/browser/ui/infobars:resources", "//ios/web", "//net", "//ui/base",
diff --git a/ios/chrome/browser/upgrade/resources/BUILD.gn b/ios/chrome/browser/upgrade/resources/BUILD.gn new file mode 100644 index 0000000..8cf608a --- /dev/null +++ b/ios/chrome/browser/upgrade/resources/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("infobar_update") { + sources = [ + "infobar_update.imageset/Contents.json", + "infobar_update.imageset/infobar_update.png", + "infobar_update.imageset/infobar_update@2x.png", + "infobar_update.imageset/infobar_update@3x.png", + ] +}
diff --git a/ios/chrome/browser/upgrade/resources/infobar_update.imageset/Contents.json b/ios/chrome/browser/upgrade/resources/infobar_update.imageset/Contents.json new file mode 100644 index 0000000..0c7057d --- /dev/null +++ b/ios/chrome/browser/upgrade/resources/infobar_update.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "infobar_update.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "infobar_update@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "infobar_update@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_update.png b/ios/chrome/browser/upgrade/resources/infobar_update.imageset/infobar_update.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_update.png rename to ios/chrome/browser/upgrade/resources/infobar_update.imageset/infobar_update.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_update@2x.png b/ios/chrome/browser/upgrade/resources/infobar_update.imageset/infobar_update@2x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_update@2x.png rename to ios/chrome/browser/upgrade/resources/infobar_update.imageset/infobar_update@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/infobars/resources/infobar_update@3x.png b/ios/chrome/browser/upgrade/resources/infobar_update.imageset/infobar_update@3x.png similarity index 100% rename from ios/chrome/browser/ui/infobars/resources/infobar_update@3x.png rename to ios/chrome/browser/upgrade/resources/infobar_update.imageset/infobar_update@3x.png Binary files differ
diff --git a/ios/chrome/search_widget_extension/search_widget_view.h b/ios/chrome/search_widget_extension/search_widget_view.h index 5efce7f..2a10a94 100644 --- a/ios/chrome/search_widget_extension/search_widget_view.h +++ b/ios/chrome/search_widget_extension/search_widget_view.h
@@ -30,14 +30,23 @@ // Designated initializer, creates the widget view with a |target| for user // actions. The |primaryVibrancyEffect| and |secondaryVibrancyEffect| are used -// to display view elements. +// to display view elements. |compactHeight| indicates the size to use in +// compact display. |initiallyCompact| indicates which mode to display on +// initialization. - (instancetype)initWithActionTarget:(id<SearchWidgetViewActionTarget>)target primaryVibrancyEffect:(UIVibrancyEffect*)primaryVibrancyEffect secondaryVibrancyEffect:(UIVibrancyEffect*)secondaryVibrancyEffect - NS_DESIGNATED_INITIALIZER; + compactHeight:(CGFloat)compactHeight + initiallyCompact:(BOOL)compact NS_DESIGNATED_INITIALIZER; - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE; +// Changes the display mode of the view to compact of expanded. +- (void)showMode:(BOOL)compact; + +// Gets the height of the widget. +- (CGFloat)widgetHeight; + // Sets the copied URL string to be displayed. nil is a valid value to indicate // there is no copied URL to display. - (void)setCopiedURLString:(NSString*)URL;
diff --git a/ios/chrome/search_widget_extension/search_widget_view.mm b/ios/chrome/search_widget_extension/search_widget_view.mm index a491bb68..08761c8 100644 --- a/ios/chrome/search_widget_extension/search_widget_view.mm +++ b/ios/chrome/search_widget_extension/search_widget_view.mm
@@ -20,21 +20,40 @@ } // namespace @interface SearchWidgetView () - +// The content displayed in the actions section. +@property(nonatomic, strong) UIView* actionsContent; +// The actions section. Can be bigger than the content within. +@property(nonatomic, strong) UIView* actionsSection; // The copied URL section. Fits its contents. @property(nonatomic, strong) CopiedURLView* copiedURLSection; +// The height used in the compact display mode. +@property(nonatomic) CGFloat compactHeight; // The target for actions in the view. @property(nonatomic, weak) id<SearchWidgetViewActionTarget> target; // The primary effect of the widget. Use for a more opaque appearance. @property(nonatomic, strong) UIVisualEffect* primaryEffect; // The secondary effect of the widget. Use for a more transparent appearance. @property(nonatomic, strong) UIVisualEffect* secondaryEffect; +// The actions section height constraint. Set its constant to modify the action +// section's height. +@property(nonatomic, strong) NSLayoutConstraint* actionsSectionHeightConstraint; -// Sets up the widget UI. -- (void)createUI; +// Sets up the widget UI for an expanded or compact appearance based on +// |compact|. +- (void)createUI:(BOOL)compact; -// Creates the view for the action buttons. -- (UIView*)newActionsView; +// Creates the views for the action buttons. +- (void)createActionsView; + +// Returns the height of the action content. +- (CGFloat)actionContentHeight; + +// Returns the height of the copied URL section. +- (CGFloat)copiedURLSectionHeight; + +// Returns the height to use for the action section, depending on the display +// mode. +- (CGFloat)actionSectionHeight:(BOOL)compact; @end @@ -44,27 +63,34 @@ @synthesize primaryEffect = _primaryEffect; @synthesize secondaryEffect = _secondaryEffect; @synthesize copiedURLSection = _copiedURLSection; +@synthesize actionsSection = _actionsSection; +@synthesize actionsContent = _actionsContent; +@synthesize compactHeight = _compactHeight; +@synthesize actionsSectionHeightConstraint = _actionsSectionHeightConstraint; - (instancetype)initWithActionTarget:(id<SearchWidgetViewActionTarget>)target primaryVibrancyEffect:(UIVibrancyEffect*)primaryVibrancyEffect - secondaryVibrancyEffect: - (UIVibrancyEffect*)secondaryVibrancyEffect { + secondaryVibrancyEffect:(UIVibrancyEffect*)secondaryVibrancyEffect + compactHeight:(CGFloat)compactHeight + initiallyCompact:(BOOL)compact { self = [super initWithFrame:CGRectZero]; if (self) { DCHECK(target); _target = target; _primaryEffect = primaryVibrancyEffect; _secondaryEffect = secondaryVibrancyEffect; - [self createUI]; + _compactHeight = compactHeight; + [self createUI:compact]; } return self; } #pragma mark - UI creation -- (void)createUI { - UIView* actionsView = [self newActionsView]; - [self addSubview:actionsView]; +- (void)createUI:(BOOL)compact { + [self createActionsView]; + _actionsSection.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:_actionsSection]; _copiedURLSection = [[CopiedURLView alloc] initWithActionTarget:self.target @@ -73,81 +99,141 @@ secondaryEffect:self.secondaryEffect]; [self addSubview:_copiedURLSection]; + _actionsSectionHeightConstraint = [self.actionsSection.heightAnchor + constraintEqualToConstant:[self actionSectionHeight:compact]]; + + [NSLayoutConstraint activateConstraints:@[ + [_actionsSection.topAnchor constraintEqualToAnchor:self.topAnchor], + [_actionsSection.bottomAnchor + constraintEqualToAnchor:_copiedURLSection.topAnchor], + + [self.leadingAnchor + constraintEqualToAnchor:self.actionsSection.leadingAnchor], + [self.leadingAnchor + constraintEqualToAnchor:self.copiedURLSection.leadingAnchor], + [self.trailingAnchor + constraintEqualToAnchor:self.actionsSection.trailingAnchor], + [self.trailingAnchor + constraintEqualToAnchor:self.copiedURLSection.trailingAnchor], + _actionsSectionHeightConstraint, + ]]; +} + +- (CGFloat)actionSectionHeight:(BOOL)compact { + if (compact) { + return self.compactHeight; + } + CGFloat contentHeight = [self actionContentHeight]; + CGFloat copiedURLHeight = [self copiedURLSectionHeight]; + CGFloat height = contentHeight + copiedURLHeight; + if (height >= self.compactHeight) { + return contentHeight; + } + return self.compactHeight - copiedURLHeight; +} + +- (CGFloat)actionContentHeight { + CGFloat height = + [self.actionsContent + systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] + .height; + return height + 2 * ui_util::kContentMargin; +} + +- (CGFloat)copiedURLSectionHeight { + CGFloat height = + [self.copiedURLSection + systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] + .height; + return height; +} + +- (void)createActionsView { + UIStackView* actionsContentStack = + [[UIStackView alloc] initWithArrangedSubviews:@[ + [[SearchActionView alloc] + initWithActionTarget:self.target + actionSelector:@selector(openSearch:) + primaryEffect:self.primaryEffect + secondaryEffect:self.secondaryEffect + title:NSLocalizedString(@"IDS_IOS_NEW_SEARCH", + @"New Search") + imageName:@"quick_action_search"], + [[SearchActionView alloc] + initWithActionTarget:self.target + actionSelector:@selector(openIncognito:) + primaryEffect:self.primaryEffect + secondaryEffect:self.secondaryEffect + title:NSLocalizedString(@"IDS_IOS_INCOGNITO_SEARCH", + @"Incognito Search") + imageName:@"quick_action_incognito_search"], + [[SearchActionView alloc] + initWithActionTarget:self.target + actionSelector:@selector(openVoice:) + primaryEffect:self.primaryEffect + secondaryEffect:self.secondaryEffect + title:NSLocalizedString(@"IDS_IOS_VOICE_SEARCH", + @"Voice Search") + imageName:@"quick_action_voice_search"], + [[SearchActionView alloc] + initWithActionTarget:self.target + actionSelector:@selector(openQRCode:) + primaryEffect:self.primaryEffect + secondaryEffect:self.secondaryEffect + title:NSLocalizedString(@"IDS_IOS_SCAN_QR_CODE", + @"Scan QR Code") + imageName:@"quick_action_camera_search"], + ]]; + + actionsContentStack.axis = UILayoutConstraintAxisHorizontal; + actionsContentStack.alignment = UIStackViewAlignmentTop; + actionsContentStack.distribution = UIStackViewDistributionFillEqually; + actionsContentStack.spacing = ui_util::kIconSpacing; + actionsContentStack.layoutMargins = UIEdgeInsetsZero; + actionsContentStack.layoutMarginsRelativeArrangement = YES; + actionsContentStack.translatesAutoresizingMaskIntoConstraints = NO; + + self.actionsContent = actionsContentStack; + + self.actionsSection = [[UIView alloc] initWithFrame:CGRectZero]; + self.actionsSection.translatesAutoresizingMaskIntoConstraints = NO; + [self.actionsSection addSubview:self.actionsContent]; + // These constraints stretch the action row to the full width of the widget. // Their priority is < UILayoutPriorityRequired so that they can break when // the view is larger than kMaxContentSize. NSLayoutConstraint* actionsLeadingConstraint = - [actionsView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor]; + [self.actionsContent.leadingAnchor + constraintEqualToAnchor:self.actionsSection.leadingAnchor + constant:ui_util::kContentMargin]; actionsLeadingConstraint.priority = UILayoutPriorityDefaultHigh; - NSLayoutConstraint* actionsTrailingConstraint = - [actionsView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor]; + [self.actionsContent.trailingAnchor + constraintEqualToAnchor:self.actionsSection.trailingAnchor + constant:-ui_util::kContentMargin]; actionsTrailingConstraint.priority = UILayoutPriorityDefaultHigh; [NSLayoutConstraint activateConstraints:@[ - [actionsView.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], - [actionsView.widthAnchor + [self.actionsSection.centerYAnchor + constraintEqualToAnchor:self.actionsContent.centerYAnchor], + [self.actionsContent.centerXAnchor + constraintEqualToAnchor:self.actionsSection.centerXAnchor], + [self.actionsContent.widthAnchor constraintLessThanOrEqualToConstant:kMaxContentSize], actionsLeadingConstraint, actionsTrailingConstraint, - [actionsView.topAnchor constraintEqualToAnchor:self.topAnchor - constant:ui_util::kContentMargin], - [actionsView.bottomAnchor - constraintEqualToAnchor:_copiedURLSection.topAnchor], - [_copiedURLSection.leadingAnchor - constraintEqualToAnchor:self.leadingAnchor], - [_copiedURLSection.trailingAnchor - constraintEqualToAnchor:self.trailingAnchor], - [_copiedURLSection.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], ]]; } -- (UIView*)newActionsView { - UIStackView* actionRow = [[UIStackView alloc] initWithArrangedSubviews:@[ - [[SearchActionView alloc] - initWithActionTarget:self.target - actionSelector:@selector(openSearch:) - primaryEffect:self.primaryEffect - secondaryEffect:self.secondaryEffect - title:NSLocalizedString(@"IDS_IOS_NEW_SEARCH", - @"New Search") - imageName:@"quick_action_search"], +#pragma mark - SearchWidgetView - [[SearchActionView alloc] - initWithActionTarget:self.target - actionSelector:@selector(openIncognito:) - primaryEffect:self.primaryEffect - secondaryEffect:self.secondaryEffect - title:NSLocalizedString(@"IDS_IOS_INCOGNITO_SEARCH", - @"Incognito Search") - imageName:@"quick_action_incognito_search"], - [[SearchActionView alloc] - initWithActionTarget:self.target - actionSelector:@selector(openVoice:) - primaryEffect:self.primaryEffect - secondaryEffect:self.secondaryEffect - title:NSLocalizedString(@"IDS_IOS_VOICE_SEARCH", - @"Voice Search") - imageName:@"quick_action_voice_search"], - [[SearchActionView alloc] - initWithActionTarget:self.target - actionSelector:@selector(openQRCode:) - primaryEffect:self.primaryEffect - secondaryEffect:self.secondaryEffect - title:NSLocalizedString(@"IDS_IOS_SCAN_QR_CODE", - @"Scan QR Code") - imageName:@"quick_action_camera_search"], - ]]; +- (void)showMode:(BOOL)compact { + self.actionsSectionHeightConstraint.constant = + [self actionSectionHeight:compact]; +} - actionRow.axis = UILayoutConstraintAxisHorizontal; - actionRow.alignment = UIStackViewAlignmentTop; - actionRow.distribution = UIStackViewDistributionFillEqually; - actionRow.spacing = ui_util::kIconSpacing; - actionRow.layoutMargins = - UIEdgeInsetsMake(0, ui_util::kContentMargin, 0, ui_util::kContentMargin); - actionRow.layoutMarginsRelativeArrangement = YES; - actionRow.translatesAutoresizingMaskIntoConstraints = NO; - return actionRow; +- (CGFloat)widgetHeight { + return [self actionContentHeight] + [self copiedURLSectionHeight]; } - (void)setCopiedURLString:(NSString*)URL {
diff --git a/ios/chrome/search_widget_extension/search_widget_view_controller.mm b/ios/chrome/search_widget_extension/search_widget_view_controller.mm index 7c29b80..1e2cf59 100644 --- a/ios/chrome/search_widget_extension/search_widget_view_controller.mm +++ b/ios/chrome/search_widget_extension/search_widget_view_controller.mm
@@ -11,6 +11,7 @@ #include "base/strings/sys_string_conversions.h" #include "components/open_from_clipboard/clipboard_recent_content_impl_ios.h" #include "ios/chrome/common/app_group/app_group_constants.h" +#import "ios/chrome/search_widget_extension/copied_url_view.h" #import "ios/chrome/search_widget_extension/search_widget_view.h" #import "ios/chrome/search_widget_extension/ui_util.h" @@ -71,6 +72,12 @@ UIVibrancyEffect* primary; UIVibrancyEffect* secondary; + CGFloat height = + self.extensionContext + ? [self.extensionContext + widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeCompact] + .height + : 110; if (base::ios::IsRunningOnIOS10OrLater()) { primary = [UIVibrancyEffect widgetPrimaryVibrancyEffect]; secondary = [UIVibrancyEffect widgetSecondaryVibrancyEffect]; @@ -81,10 +88,14 @@ // A local variable is necessary here as the property is declared weak and the // object would be deallocated before being retained by the addSubview call. - SearchWidgetView* widgetView = - [[SearchWidgetView alloc] initWithActionTarget:self - primaryVibrancyEffect:primary - secondaryVibrancyEffect:secondary]; + SearchWidgetView* widgetView = [[SearchWidgetView alloc] + initWithActionTarget:self + primaryVibrancyEffect:primary + secondaryVibrancyEffect:secondary + compactHeight:height + initiallyCompact:([self.extensionContext + widgetActiveDisplayMode] == + NCWidgetDisplayModeCompact)]; self.widgetView = widgetView; [self.view addSubview:self.widgetView]; @@ -121,29 +132,35 @@ return NO; } +- (void)viewWillTransitionToSize:(CGSize)size + withTransitionCoordinator: + (id<UIViewControllerTransitionCoordinator>)coordinator { + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + + BOOL isCompact = [self.extensionContext widgetActiveDisplayMode] == + NCWidgetDisplayModeCompact; + + [coordinator + animateAlongsideTransition:^( + id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { + [self.widgetView showMode:isCompact]; + } + completion:nil]; +} + #pragma mark - NCWidgetProviding - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { - BOOL isVariableHeight = (activeDisplayMode == NCWidgetDisplayModeExpanded); - - // If the widget's height is not variable, the preferredContentSize is the - // maxSize. Widgets cannot be shrunk, and this ensures the view will lay - // itself out according to the actual screen size. (This is only likely to - // happen if the accessibility option for larger font is used.) If the widget - // is not a fixed size, if the fitting size for the widget's contents is - // larger than the maximum size for the current widget display mode, this - // maximum size is used for the widget. Otherwise, the preferredContentSize is - // set to the fitting size so that the widget gets the correct height. - if (isVariableHeight) { - CGSize fittingSize = [self.widgetView - systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; - if (fittingSize.height < maxSize.height) { - self.preferredContentSize = fittingSize; - return; - } + switch (activeDisplayMode) { + case NCWidgetDisplayModeCompact: + self.preferredContentSize = maxSize; + break; + case NCWidgetDisplayModeExpanded: + self.preferredContentSize = + CGSizeMake(maxSize.width, [self.widgetView widgetHeight]); + break; } - self.preferredContentSize = maxSize; } // Implementing this method removes the leading edge inset for iOS version < 10.
diff --git a/ios/chrome/today_extension/BUILD.gn b/ios/chrome/today_extension/BUILD.gn index 6d2ba0d..886ed21 100644 --- a/ios/chrome/today_extension/BUILD.gn +++ b/ios/chrome/today_extension/BUILD.gn
@@ -58,7 +58,10 @@ deps = [ ":packed_resources", - ":resources", + "resources:todayview_clipboard", + "resources:todayview_new_tab", + "resources:todayview_physical_web", + "resources:todayview_voice_search", "//base", "//base:i18n", "//components/metrics", @@ -96,24 +99,3 @@ entitlements_target = ":entitlements" info_plist_target = ":tweak_info_plist" } - -bundle_data("resources") { - visibility = [ ":*" ] - sources = [ - "resources/todayview_clipboard.png", - "resources/todayview_clipboard@2x.png", - "resources/todayview_clipboard@3x.png", - "resources/todayview_new_tab.png", - "resources/todayview_new_tab@2x.png", - "resources/todayview_new_tab@3x.png", - "resources/todayview_physical_web.png", - "resources/todayview_physical_web@2x.png", - "resources/todayview_physical_web@3x.png", - "resources/todayview_voice_search.png", - "resources/todayview_voice_search@2x.png", - "resources/todayview_voice_search@3x.png", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] -}
diff --git a/ios/chrome/today_extension/resources/BUILD.gn b/ios/chrome/today_extension/resources/BUILD.gn new file mode 100644 index 0000000..43c0b52 --- /dev/null +++ b/ios/chrome/today_extension/resources/BUILD.gn
@@ -0,0 +1,41 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ios/imageset.gni") + +imageset("todayview_new_tab") { + sources = [ + "todayview_new_tab.imageset/Contents.json", + "todayview_new_tab.imageset/todayview_new_tab.png", + "todayview_new_tab.imageset/todayview_new_tab@2x.png", + "todayview_new_tab.imageset/todayview_new_tab@3x.png", + ] +} + +imageset("todayview_clipboard") { + sources = [ + "todayview_clipboard.imageset/Contents.json", + "todayview_clipboard.imageset/todayview_clipboard.png", + "todayview_clipboard.imageset/todayview_clipboard@2x.png", + "todayview_clipboard.imageset/todayview_clipboard@3x.png", + ] +} + +imageset("todayview_physical_web") { + sources = [ + "todayview_physical_web.imageset/Contents.json", + "todayview_physical_web.imageset/todayview_physical_web.png", + "todayview_physical_web.imageset/todayview_physical_web@2x.png", + "todayview_physical_web.imageset/todayview_physical_web@3x.png", + ] +} + +imageset("todayview_voice_search") { + sources = [ + "todayview_voice_search.imageset/Contents.json", + "todayview_voice_search.imageset/todayview_voice_search.png", + "todayview_voice_search.imageset/todayview_voice_search@2x.png", + "todayview_voice_search.imageset/todayview_voice_search@3x.png", + ] +}
diff --git a/ios/chrome/today_extension/resources/todayview_clipboard.imageset/Contents.json b/ios/chrome/today_extension/resources/todayview_clipboard.imageset/Contents.json new file mode 100644 index 0000000..d206f7a --- /dev/null +++ b/ios/chrome/today_extension/resources/todayview_clipboard.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "todayview_clipboard.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "todayview_clipboard@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "todayview_clipboard@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/today_extension/resources/todayview_clipboard.png b/ios/chrome/today_extension/resources/todayview_clipboard.imageset/todayview_clipboard.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_clipboard.png rename to ios/chrome/today_extension/resources/todayview_clipboard.imageset/todayview_clipboard.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_clipboard@2x.png b/ios/chrome/today_extension/resources/todayview_clipboard.imageset/todayview_clipboard@2x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_clipboard@2x.png rename to ios/chrome/today_extension/resources/todayview_clipboard.imageset/todayview_clipboard@2x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_clipboard@3x.png b/ios/chrome/today_extension/resources/todayview_clipboard.imageset/todayview_clipboard@3x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_clipboard@3x.png rename to ios/chrome/today_extension/resources/todayview_clipboard.imageset/todayview_clipboard@3x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_new_tab.imageset/Contents.json b/ios/chrome/today_extension/resources/todayview_new_tab.imageset/Contents.json new file mode 100644 index 0000000..ed72e058 --- /dev/null +++ b/ios/chrome/today_extension/resources/todayview_new_tab.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "todayview_new_tab.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "todayview_new_tab@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "todayview_new_tab@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/today_extension/resources/todayview_new_tab.png b/ios/chrome/today_extension/resources/todayview_new_tab.imageset/todayview_new_tab.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_new_tab.png rename to ios/chrome/today_extension/resources/todayview_new_tab.imageset/todayview_new_tab.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_new_tab@2x.png b/ios/chrome/today_extension/resources/todayview_new_tab.imageset/todayview_new_tab@2x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_new_tab@2x.png rename to ios/chrome/today_extension/resources/todayview_new_tab.imageset/todayview_new_tab@2x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_new_tab@3x.png b/ios/chrome/today_extension/resources/todayview_new_tab.imageset/todayview_new_tab@3x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_new_tab@3x.png rename to ios/chrome/today_extension/resources/todayview_new_tab.imageset/todayview_new_tab@3x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_physical_web.imageset/Contents.json b/ios/chrome/today_extension/resources/todayview_physical_web.imageset/Contents.json new file mode 100644 index 0000000..e564e60a --- /dev/null +++ b/ios/chrome/today_extension/resources/todayview_physical_web.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "todayview_physical_web.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "todayview_physical_web@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "todayview_physical_web@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/today_extension/resources/todayview_physical_web.png b/ios/chrome/today_extension/resources/todayview_physical_web.imageset/todayview_physical_web.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_physical_web.png rename to ios/chrome/today_extension/resources/todayview_physical_web.imageset/todayview_physical_web.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_physical_web@2x.png b/ios/chrome/today_extension/resources/todayview_physical_web.imageset/todayview_physical_web@2x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_physical_web@2x.png rename to ios/chrome/today_extension/resources/todayview_physical_web.imageset/todayview_physical_web@2x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_physical_web@3x.png b/ios/chrome/today_extension/resources/todayview_physical_web.imageset/todayview_physical_web@3x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_physical_web@3x.png rename to ios/chrome/today_extension/resources/todayview_physical_web.imageset/todayview_physical_web@3x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_voice_search.imageset/Contents.json b/ios/chrome/today_extension/resources/todayview_voice_search.imageset/Contents.json new file mode 100644 index 0000000..79e3b14 --- /dev/null +++ b/ios/chrome/today_extension/resources/todayview_voice_search.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "todayview_voice_search.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "todayview_voice_search@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "todayview_voice_search@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/today_extension/resources/todayview_voice_search.png b/ios/chrome/today_extension/resources/todayview_voice_search.imageset/todayview_voice_search.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_voice_search.png rename to ios/chrome/today_extension/resources/todayview_voice_search.imageset/todayview_voice_search.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_voice_search@2x.png b/ios/chrome/today_extension/resources/todayview_voice_search.imageset/todayview_voice_search@2x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_voice_search@2x.png rename to ios/chrome/today_extension/resources/todayview_voice_search.imageset/todayview_voice_search@2x.png Binary files differ
diff --git a/ios/chrome/today_extension/resources/todayview_voice_search@3x.png b/ios/chrome/today_extension/resources/todayview_voice_search.imageset/todayview_voice_search@3x.png similarity index 100% rename from ios/chrome/today_extension/resources/todayview_voice_search@3x.png rename to ios/chrome/today_extension/resources/todayview_voice_search.imageset/todayview_voice_search@3x.png Binary files differ
diff --git a/ios/showcase/content_suggestions/sc_content_suggestions_data_source.mm b/ios/showcase/content_suggestions/sc_content_suggestions_data_source.mm index 6fdc54c7..bcd9e3cb 100644 --- a/ios/showcase/content_suggestions/sc_content_suggestions_data_source.mm +++ b/ios/showcase/content_suggestions/sc_content_suggestions_data_source.mm
@@ -127,14 +127,6 @@ callback:(MoreSuggestionsFetched)callback { } -- (void)fetchFaviconAttributesForItem:(CSCollectionViewItem*)item - completion:(void (^)(FaviconAttributes*))completion { -} - -- (void)fetchFaviconImageForItem:(CSCollectionViewItem*)item - completion:(void (^)(UIImage*))completion { -} - - (void)dismissSuggestion:(ContentSuggestionIdentifier*)suggestionIdentifier { }
diff --git a/ios/showcase/content_suggestions/sc_content_suggestions_item.h b/ios/showcase/content_suggestions/sc_content_suggestions_item.h index 7fe725f..4425be0c 100644 --- a/ios/showcase/content_suggestions/sc_content_suggestions_item.h +++ b/ios/showcase/content_suggestions/sc_content_suggestions_item.h
@@ -10,6 +10,8 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" +@class FaviconAttributes; + // Content Suggestions item configuring a ContentSuggetionsCell. @interface SCContentSuggestionsItem : CollectionViewItem<SuggestedContent> @@ -19,6 +21,7 @@ @property(nonatomic, copy) NSString* publisher; @property(nonatomic, copy) NSString* publicationDate; @property(nonatomic, assign) BOOL availableOffline; +@property(nonatomic, strong) FaviconAttributes* attributes; @end
diff --git a/ios/showcase/content_suggestions/sc_content_suggestions_most_visited_item.h b/ios/showcase/content_suggestions/sc_content_suggestions_most_visited_item.h index 21aaba1..1da67ef 100644 --- a/ios/showcase/content_suggestions/sc_content_suggestions_most_visited_item.h +++ b/ios/showcase/content_suggestions/sc_content_suggestions_most_visited_item.h
@@ -10,11 +10,14 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/chrome/browser/ui/content_suggestions/cells/suggested_content.h" +@class FaviconAttributes; + // Content Suggestions item configuring a ContentSuggetionsMostVisitedCell. @interface SCContentSuggestionsMostVisitedItem : CollectionViewItem<SuggestedContent> @property(nonatomic, copy) NSString* title; +@property(nonatomic, strong) FaviconAttributes* attributes; @end
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 87107b1..e6beca6 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -16773,6 +16773,25 @@ }, { "args": [ + "--test-launcher-batch-limit=400", + "--deqp-egl-display-type=angle-d3d11" + ], + "name": "angle_deqp_gles3_d3d11_tests", + "swarming": { + "can_use_on_swarming_builders": false, + "dimension_sets": [ + { + "gpu": "1002:6613", + "os": "Windows-2008ServerR2-SP1" + } + ], + "shards": 12 + }, + "test": "angle_deqp_gles3_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests", "--test-launcher-retry-limit=0" ], @@ -17372,6 +17391,25 @@ }, { "args": [ + "--test-launcher-batch-limit=400", + "--deqp-egl-display-type=angle-d3d11" + ], + "name": "angle_deqp_gles3_d3d11_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:6613", + "os": "Windows-2008ServerR2-SP1" + } + ], + "shards": 12 + }, + "test": "angle_deqp_gles3_tests", + "use_xvfb": false + }, + { + "args": [ "--use-gpu-in-tests", "--test-launcher-retry-limit=0" ],
diff --git a/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-creation.html b/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-creation.html new file mode 100644 index 0000000..bc26e2df --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-creation.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<style> +.scroller { + height: 100px; + width: 100px; + overflow: scroll; +} + +.content { + height: 500px; + width: 500px; +} +</style> + +<div class='scroller'> + <div class='content'></div> +</div> + +<script src='../../../resources/testharness.js'></script> +<script src='../../../resources/testharnessreport.js'></script> +<script> +test(function() { + const scroller = document.querySelector('.scroller'); + const scrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: 100, orientation: 'inline' }); + + assert_equals(scrollTimeline.scrollSource, scroller); + assert_equals(scrollTimeline.timeRange, 100); + assert_equals(scrollTimeline.orientation, 'inline'); +}, 'Basic ScrollTimeline creation should work'); + +test(function() { + const scrollTimeline = new ScrollTimeline( + { timeRange: 100, orientation: 'block' }); + + assert_equals(scrollTimeline.scrollSource, document.scrollingElement); +}, 'If the scrollSource is unspecified, use the document scrollingElement'); + +test(function() { + const scroller = document.querySelector('.scroller'); + const constructorFunc = function() { new ScrollTimeline( + { scrollSource: scroller, orientation: 'nonsense', timeRange: 100 }) }; + assert_throws(TypeError(), constructorFunc); +}, 'If the orientation is invalid, object construction should fail'); + +// TODO(smcgruer): Remove once 'auto' timeRange is supported. +test(function() { + const scroller = document.querySelector('.scroller'); + const constructorFunc = function() { new ScrollTimeline( + { scrollSource: scroller, orientation: 'block' }) }; + assert_throws('NotSupportedError', constructorFunc); +}, 'If the timeRange is unspecified, object construction should fail'); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-currenttime-nan.html b/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-currenttime-nan.html new file mode 100644 index 0000000..1cebc9d99 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-currenttime-nan.html
@@ -0,0 +1,75 @@ +<!DOCTYPE html> +<style> +.scroller { + height: 100px; + width: 100px; + overflow: auto; +} + +.content { + height: 500px; + width: 500px; +} +</style> + +<script src='../../../resources/testharness.js'></script> +<script src='../../../resources/testharnessreport.js'></script> + +<div id='inlineScroller' class='scroller' style='display: inline;'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#inlineScroller'); + const scrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: 100, orientation: 'block' }); + + assert_equals(scrollTimeline.currentTime, NaN); +}, 'currentTime returns NaN for a display: inline scrollSource'); +</script> + +<div id='displayNoneScroller' class='scroller' style='display: none;'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#displayNoneScroller'); + const scrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: 100, orientation: 'block' }); + + assert_equals(scrollTimeline.currentTime, NaN); +}, 'currentTime returns NaN for a display: none scrollSource'); +</script> + +<script> +test(function() { + const scroller = document.createElement('div'); + const content = document.createElement('div'); + + scroller.style.overflow = 'auto'; + scroller.style.height = '100px'; + scroller.style.width = '100px'; + content.style.height = '250px'; + content.style.width = '250px'; + + scroller.appendChild(content); + + const scrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: 100, orientation: 'block' }); + + assert_equals(scrollTimeline.currentTime, NaN); +}, 'currentTime returns NaN for an unattached scrollSource'); +</script> + +<div id='notAScroller' class='scroller' style='overflow: visible;'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#notAScroller'); + const scrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: 100, orientation: 'block' }); + + assert_equals(scrollTimeline.currentTime, NaN); +}, 'currentTime returns NaN when the scrollSource is not a scroller'); +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-currenttime.html b/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-currenttime.html new file mode 100644 index 0000000..b262457f --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/animation/scroll-animations/scrolltimeline-currenttime.html
@@ -0,0 +1,169 @@ +<!DOCTYPE html> +<style> +.scroller { + height: 100px; + width: 100px; + overflow: scroll; +} + +.content { + height: 500px; + width: 500px; +} +</style> + +<script src='../../../resources/testharness.js'></script> +<script src='../../../resources/testharnessreport.js'></script> + +<div id='scroller1' class='scroller'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#scroller1'); + // For simplicity, we set the timeRange such that currentTime maps directly to + // the value scrolled. We have a square scroller/contents, so can just compute + // one edge and use it for inline and block. + const scrollerSize = scroller.scrollHeight - scroller.clientHeight; + + const blockScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'block' }); + const inlineScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'inline' }); + + // Unscrolled, both timelines should read a currentTime of 0. + assert_equals(blockScrollTimeline.currentTime, 0); + assert_equals(inlineScrollTimeline.currentTime, 0); + + // Now do some scrolling and make sure that the ScrollTimelines update. + scroller.scrollTop = 50; + scroller.scrollLeft = 75; + + // As noted above, we have mapped timeRange such that currentTime should just + // be the scroll offset. + assert_equals(blockScrollTimeline.currentTime, 50); + assert_equals(inlineScrollTimeline.currentTime, 75); +}, 'currentTime calculates the correct time based on scrolled amount'); +</script> + + +<div id='scroller2' class='scroller'> + <div class='content' style='height: 1000px; width: 1000px;'></div> +</div> +<script> +test(function() { + // It is unfortunately difficult to calculate what scroll offset results in an + // exact currentTime. Scrolling is calculated in integers which allows for the + // possibility of rounding, and scrollbar widths differ between platforms + // which means it is not possible to ensure a divisible scroller size. + // + // Instead we make the scroller content big enough that a 1-pixel rounding + // difference results in a negligible difference in the output value. + + const scroller = document.querySelector('#scroller2'); + const scrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: 100, orientation: 'block' }); + + // Mapping timeRange to 100 gives a form of 'percentage scrolled', so + // calculate where the 50% scroll mark would be. + const halfwayY = (scroller.scrollHeight - scroller.clientHeight) / 2; + scroller.scrollTop = halfwayY; + + assert_approx_equals(scrollTimeline.currentTime, 50, 0.5); +}, 'currentTime adjusts correctly for the timeRange'); +</script> + +<div id='scroller3' class='scroller' style='direction: rtl;'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#scroller3'); + + // For simplicity, we set the timeRange such that currentTime maps directly to + // the value scrolled. We have a square scroller/contents, so can just compute + // one edge and use it for inline and block. + const scrollerSize = scroller.scrollHeight - scroller.clientHeight; + + const blockScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'block' }); + const inlineScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'inline' }); + + // Unscrolled, both timelines should read a current time of 0 even though the + // X-axis will have started at the right hand side for rtl. + assert_equals(blockScrollTimeline.currentTime, 0); + assert_equals(inlineScrollTimeline.currentTime, 0); + + // The offset in the inline direction should be inverted. The block direction + // should be unaffected. + scroller.scrollTop = 50; + scroller.scrollLeft = 75; + + assert_equals(blockScrollTimeline.currentTime, 50); + assert_equals(inlineScrollTimeline.currentTime, scrollerSize - 75); +}, 'currentTime handles direction: rtl correctly'); +</script> + +<div id='scroller4' class='scroller' style='writing-mode: vertical-rl;'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#scroller4'); + + // For simplicity, we set the timeRange such that currentTime maps directly to + // the value scrolled. We have a square scroller/contents, so can just compute + // one edge and use it for inline and block. + const scrollerSize = scroller.scrollHeight - scroller.clientHeight; + + const blockScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'block' }); + const inlineScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'inline' }); + + // Unscrolled, both timelines should read a current time of 0 even though the + // X-axis will have started at the right hand side for vertical-rl. + assert_equals(blockScrollTimeline.currentTime, 0); + assert_equals(inlineScrollTimeline.currentTime, 0); + + // For vertical-rl, the X-axis starts on the right-hand-side and is the block + // axis. The Y-axis is normal but is the inline axis. + scroller.scrollTop = 50; + scroller.scrollLeft = 75; + + assert_equals(blockScrollTimeline.currentTime, scrollerSize - 75); + assert_equals(inlineScrollTimeline.currentTime, 50); +}, 'currentTime handles writing-mode: vertical-rl correctly'); +</script> + +<div id='scroller5' class='scroller' style='writing-mode: vertical-lr;'> + <div class='content'></div> +</div> +<script> +test(function() { + const scroller = document.querySelector('#scroller5'); + + // For simplicity, we set the timeRange such that currentTime maps directly to + // the value scrolled. We have a square scroller/contents, so can just compute + // one edge and use it for inline and block. + const scrollerSize = scroller.scrollHeight - scroller.clientHeight; + + const blockScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'block' }); + const inlineScrollTimeline = new ScrollTimeline( + { scrollSource: scroller, timeRange: scrollerSize, orientation: 'inline' }); + + // Unscrolled, both timelines should read a current time of 0. + assert_equals(blockScrollTimeline.currentTime, 0); + assert_equals(inlineScrollTimeline.currentTime, 0); + + // For vertical-lr, both axes start at their 'normal' positions but the X-axis + // is the block direction and the Y-axis is the inline direction. + scroller.scrollTop = 50; + scroller.scrollLeft = 75; + + assert_equals(blockScrollTimeline.currentTime, 75); + assert_equals(inlineScrollTimeline.currentTime, 50); +}, 'currentTime handles writing-mode: vertical-lr correctly'); +</script>
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt index b4b4f0c..1eb4b88 100644 --- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload-disabled/webexposed/global-interface-listing-expected.txt
@@ -6421,6 +6421,12 @@ getter onaudioprocess method constructor setter onaudioprocess +interface ScrollTimeline : AnimationTimeline + attribute @@toStringTag + getter orientation + getter scrollSource + getter timeRange + method constructor interface SecurityPolicyViolationEvent : Event attribute @@toStringTag getter blockedURI
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 fa94703..3343c104 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -6428,6 +6428,12 @@ getter onaudioprocess method constructor setter onaudioprocess +interface ScrollTimeline : AnimationTimeline + attribute @@toStringTag + getter orientation + getter scrollSource + getter timeRange + method constructor interface SecurityPolicyViolationEvent : Event attribute @@toStringTag getter blockedURI
diff --git a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn index 4d57a5e..4c8d4ff8 100644 --- a/third_party/WebKit/Source/bindings/core/v8/BUILD.gn +++ b/third_party/WebKit/Source/bindings/core/v8/BUILD.gn
@@ -33,6 +33,8 @@ "$bindings_core_v8_output_dir/DoubleOrDoubleSequence.h", "$bindings_core_v8_output_dir/DoubleOrInternalEnum.cpp", "$bindings_core_v8_output_dir/DoubleOrInternalEnum.h", + "$bindings_core_v8_output_dir/DoubleOrScrollTimelineAutoKeyword.cpp", + "$bindings_core_v8_output_dir/DoubleOrScrollTimelineAutoKeyword.h", "$bindings_core_v8_output_dir/DoubleOrString.cpp", "$bindings_core_v8_output_dir/DoubleOrString.h", "$bindings_core_v8_output_dir/DoubleOrStringOrStringArray.cpp",
diff --git a/third_party/WebKit/Source/core/animation/BUILD.gn b/third_party/WebKit/Source/core/animation/BUILD.gn index a5cba13..930949e62 100644 --- a/third_party/WebKit/Source/core/animation/BUILD.gn +++ b/third_party/WebKit/Source/core/animation/BUILD.gn
@@ -205,6 +205,8 @@ "SVGValueInterpolationType.h", "SampledEffect.cpp", "SampledEffect.h", + "ScrollTimeline.cpp", + "ScrollTimeline.h", "ShadowInterpolationFunctions.cpp", "ShadowInterpolationFunctions.h", "ShadowListPropertyFunctions.h",
diff --git a/third_party/WebKit/Source/core/animation/ScrollTimeline.cpp b/third_party/WebKit/Source/core/animation/ScrollTimeline.cpp new file mode 100644 index 0000000..dcba861b --- /dev/null +++ b/third_party/WebKit/Source/core/animation/ScrollTimeline.cpp
@@ -0,0 +1,149 @@ +// 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 "core/animation/ScrollTimeline.h" + +#include "core/dom/ExceptionCode.h" +#include "core/layout/LayoutBox.h" +#include "core/paint/PaintLayerScrollableArea.h" + +namespace blink { + +namespace { +bool StringToScrollDirection(String scroll_direction, + ScrollTimeline::ScrollDirection& result) { + // TODO(smcgruer): Support 'auto' value. + if (scroll_direction == "block") { + result = ScrollTimeline::Block; + return true; + } + if (scroll_direction == "inline") { + result = ScrollTimeline::Inline; + return true; + } + return false; +} +} // namespace + +ScrollTimeline* ScrollTimeline::Create(Document& document, + ScrollTimelineOptions options, + ExceptionState& exception_state) { + Element* scroll_source = options.scrollSource() ? options.scrollSource() + : document.scrollingElement(); + + ScrollDirection orientation; + if (!StringToScrollDirection(options.orientation(), orientation)) { + exception_state.ThrowDOMException(kNotSupportedError, + "Invalid orientation"); + return nullptr; + } + + // TODO(smcgruer): Support 'auto' value. + if (options.timeRange().isScrollTimelineAutoKeyword()) { + exception_state.ThrowDOMException( + kNotSupportedError, "'auto' value for timeRange not yet supported"); + return nullptr; + } + + return new ScrollTimeline(document, scroll_source, orientation, + options.timeRange().getAsDouble()); +} + +ScrollTimeline::ScrollTimeline(const Document& document, + Element* scroll_source, + ScrollDirection orientation, + double time_range) + : scroll_source_(scroll_source), + orientation_(orientation), + time_range_(time_range) { + DCHECK(RuntimeEnabledFeatures::CompositorWorkerEnabled()); +} + +double ScrollTimeline::currentTime(bool& is_null) { + // 1. If scrollSource does not currently have a CSS layout box, or if its + // layout box is not a scroll container, return an unresolved time value. + LayoutBox* layout_box = scroll_source_->GetLayoutBox(); + if (!layout_box || !layout_box->HasOverflowClip()) { + is_null = false; + return std::numeric_limits<double>::quiet_NaN(); + } + + // 2. Otherwise, let current scroll offset be the current scroll offset of + // scrollSource in the direction specified by orientation. + + // Depending on the writing-mode and direction, the scroll origin shifts and + // the scroll offset may be negative. The easiest way to deal with this is to + // use only the magnitude of the scroll offset, and compare it to (max-offset + // - min_offset). + PaintLayerScrollableArea* scrollable_area = layout_box->GetScrollableArea(); + // Using the absolute value of the scroll offset only makes sense if either + // the max or min scroll offset for a given axis is 0. This should be + // guaranteed by the scroll origin code, but these DCHECKs ensure that. + DCHECK(scrollable_area->MaximumScrollOffset().Height() == 0 || + scrollable_area->MinimumScrollOffset().Height() == 0); + DCHECK(scrollable_area->MaximumScrollOffset().Width() == 0 || + scrollable_area->MinimumScrollOffset().Width() == 0); + ScrollOffset scroll_offset = scrollable_area->GetScrollOffset(); + ScrollOffset scroll_dimensions = scrollable_area->MaximumScrollOffset() - + scrollable_area->MinimumScrollOffset(); + + double current_offset; + double max_offset; + bool is_horizontal = layout_box->IsHorizontalWritingMode(); + if (orientation_ == Block) { + current_offset = + is_horizontal ? scroll_offset.Height() : scroll_offset.Width(); + max_offset = + is_horizontal ? scroll_dimensions.Height() : scroll_dimensions.Width(); + } else { + DCHECK(orientation_ == Inline); + current_offset = + is_horizontal ? scroll_offset.Width() : scroll_offset.Height(); + max_offset = + is_horizontal ? scroll_dimensions.Width() : scroll_dimensions.Height(); + } + + // 3. If current scroll offset is less than startScrollOffset, return an + // unresolved time value if fill is none or forwards, or 0 otherwise. + // TODO(smcgruer): Implement |startScrollOffset| and |fill|. + + // 4. If current scroll offset is greater than or equal to endScrollOffset, + // return an unresolved time value if fill is none or backwards, or the + // effective time range otherwise. + // TODO(smcgruer): Implement |endScrollOffset| and |fill|. + + // 5. Return the result of evaluating the following expression: + // ((current scroll offset - startScrollOffset) / + // (endScrollOffset - startScrollOffset)) * effective time range + + is_null = false; + return (std::abs(current_offset) / max_offset) * time_range_; +} + +Element* ScrollTimeline::scrollSource() { + return scroll_source_.Get(); +} + +String ScrollTimeline::orientation() { + switch (orientation_) { + case Block: + return "block"; + case Inline: + return "inline"; + default: + NOTREACHED(); + return ""; + } +} + +void ScrollTimeline::timeRange(DoubleOrScrollTimelineAutoKeyword& result) { + result.setDouble(time_range_); +} + +DEFINE_TRACE(ScrollTimeline) { + visitor->Trace(scroll_source_); + AnimationTimeline::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/animation/ScrollTimeline.h b/third_party/WebKit/Source/core/animation/ScrollTimeline.h new file mode 100644 index 0000000..ad37c5b0 --- /dev/null +++ b/third_party/WebKit/Source/core/animation/ScrollTimeline.h
@@ -0,0 +1,59 @@ +// 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 ScrollTimeline_h +#define ScrollTimeline_h + +#include "core/CoreExport.h" +#include "core/animation/AnimationTimeline.h" +#include "core/animation/ScrollTimelineOptions.h" +#include "core/dom/Element.h" +#include "platform/bindings/ScriptWrappable.h" +#include "platform/wtf/text/WTFString.h" + +namespace blink { + +// Implements the ScrollTimeline concept from the Scroll-linked Animations spec. +// +// A ScrollTimeline is a special form of AnimationTimeline whose time values are +// not determined by wall-clock time but instead the progress of scrolling in a +// scroll container. The user is able to specify which scroll container to +// track, the direction of scroll they care about, and various attributes to +// control the conversion of scroll amount to time output. +// +// Spec: https://wicg.github.io/scroll-animations/#scroll-timelines +class CORE_EXPORT ScrollTimeline final : public AnimationTimeline { + DEFINE_WRAPPERTYPEINFO(); + + public: + enum ScrollDirection { + Block, + Inline, + }; + + static ScrollTimeline* Create(Document&, + ScrollTimelineOptions, + ExceptionState&); + + // AnimationTimeline implementation. + double currentTime(bool& is_null) final; + + // IDL API implementation. + Element* scrollSource(); + String orientation(); + void timeRange(DoubleOrScrollTimelineAutoKeyword&); + + DECLARE_VIRTUAL_TRACE(); + + private: + ScrollTimeline(const Document&, Element*, ScrollDirection, double); + + Member<Element> scroll_source_; + ScrollDirection orientation_; + double time_range_; +}; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/core/animation/ScrollTimeline.idl b/third_party/WebKit/Source/core/animation/ScrollTimeline.idl new file mode 100644 index 0000000..d4b5449f --- /dev/null +++ b/third_party/WebKit/Source/core/animation/ScrollTimeline.idl
@@ -0,0 +1,16 @@ +// 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. + +// https://wicg.github.io/scroll-animations/#scrolltimeline-interface + +[ + Constructor(optional ScrollTimelineOptions options), + ConstructorCallWith=Document, + RaisesException=Constructor, + RuntimeEnabled=CompositorWorker +] interface ScrollTimeline : AnimationTimeline { + readonly attribute Element? scrollSource; + readonly attribute ScrollDirection orientation; + readonly attribute (double or ScrollTimelineAutoKeyword) timeRange; +};
diff --git a/third_party/WebKit/Source/core/animation/ScrollTimelineOptions.idl b/third_party/WebKit/Source/core/animation/ScrollTimelineOptions.idl new file mode 100644 index 0000000..aaaae39 --- /dev/null +++ b/third_party/WebKit/Source/core/animation/ScrollTimelineOptions.idl
@@ -0,0 +1,18 @@ +// 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. + +// https://wicg.github.io/scroll-animations/#dictdef-scrolltimelineoptions + +enum ScrollDirection { + "block", + "inline", +}; + +enum ScrollTimelineAutoKeyword { "auto" }; + +dictionary ScrollTimelineOptions { + Element scrollSource; + ScrollDirection orientation = "block"; + (double or ScrollTimelineAutoKeyword) timeRange = "auto"; +};
diff --git a/third_party/WebKit/Source/core/core_idl_files.gni b/third_party/WebKit/Source/core/core_idl_files.gni index a7fec9f..5a76b17 100644 --- a/third_party/WebKit/Source/core/core_idl_files.gni +++ b/third_party/WebKit/Source/core/core_idl_files.gni
@@ -34,6 +34,7 @@ "animation/DocumentTimeline.idl", "animation/KeyframeEffect.idl", "animation/KeyframeEffectReadOnly.idl", + "animation/ScrollTimeline.idl", "clipboard/DataTransfer.idl", "clipboard/DataTransferItemList.idl", "css/CSS.idl", @@ -511,6 +512,7 @@ "animation/DocumentTimelineOptions.idl", "animation/KeyframeAnimationOptions.idl", "animation/KeyframeEffectOptions.idl", + "animation/ScrollTimelineOptions.idl", "css/FontFaceDescriptors.idl", "css/FontFaceSetLoadEventInit.idl", "css/MediaQueryListEventInit.idl",
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn index d87d1f78..7a5487e 100644 --- a/third_party/WebKit/Source/core/dom/BUILD.gn +++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -451,6 +451,8 @@ "custom/V0CustomElementUpgradeCandidateMap.h", ] + jumbo_excluded_sources = [ "Modulator.cpp" ] # https://crbug.com/716395 + configs += [ # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. "//build/config/compiler:no_size_t_to_int_warning",
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp index 5a593181..a9643ee 100644 --- a/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp +++ b/third_party/WebKit/Source/modules/payments/PaymentRequestRespondWithObserver.cpp
@@ -54,6 +54,7 @@ case kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin: case kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin: case kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest: + case kWebServiceWorkerResponseErrorDataPipeCreationFailed: NOTREACHED(); error_message = error_message + "an unexpected error occurred."; break;
diff --git a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp index a8479fd..1c247a24 100644 --- a/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp +++ b/third_party/WebKit/Source/modules/sensor/SensorProxy.cpp
@@ -238,8 +238,10 @@ void SensorProxy::OnRemoveConfigurationCompleted(double frequency, bool result) { - if (!result) + if (!result) { DVLOG(1) << "Failure at sensor configuration removal"; + return; + } size_t index = frequencies_used_.Find(frequency); if (index == kNotFound) { @@ -248,6 +250,7 @@ } frequencies_used_.erase(index); + UpdatePollingStatus(); } bool SensorProxy::TryReadFromBuffer(device::SensorReading& result) {
diff --git a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp index a3be0ea..b1989f7b 100644 --- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
@@ -94,6 +94,9 @@ "a redirected response was used for a request whose " "redirect mode is not \"follow\"."; break; + case kWebServiceWorkerResponseErrorDataPipeCreationFailed: + error_message = error_message + "insufficient resources."; + break; case kWebServiceWorkerResponseErrorUnknown: default: error_message = error_message + "an unexpected error occurred."; @@ -231,29 +234,33 @@ RefPtr<BlobDataHandle> blob_data_handle = buffer->DrainAsBlobDataHandle( BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize); if (blob_data_handle) { - // Handle the blob response. + // Handle the blob response body. web_response.SetBlobDataHandle(blob_data_handle); ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); return; } - // Handle the stream response. - mojo::DataPipe data_pipe; - // Temporary CHECKs to debug https://crbug.com/734978. - CHECK(data_pipe.producer_handle.is_valid()); - CHECK(data_pipe.consumer_handle.is_valid()); + // Handle the stream response body. + mojo::ScopedDataPipeProducerHandle producer; + mojo::ScopedDataPipeConsumerHandle consumer; + MojoResult result = mojo::CreateDataPipe(nullptr, &producer, &consumer); + if (result != MOJO_RESULT_OK) { + OnResponseRejected(kWebServiceWorkerResponseErrorDataPipeCreationFailed); + return; + } + DCHECK(producer.is_valid()); + DCHECK(consumer.is_valid()); std::unique_ptr<WebServiceWorkerStreamHandle> body_stream_handle = - WTF::MakeUnique<WebServiceWorkerStreamHandle>( - std::move(data_pipe.consumer_handle)); + WTF::MakeUnique<WebServiceWorkerStreamHandle>(std::move(consumer)); ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) ->RespondToFetchEventWithResponseStream(event_id_, web_response, body_stream_handle.get(), event_dispatch_time_); - buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe( - std::move(data_pipe.producer_handle)), - new FetchLoaderClient(std::move(body_stream_handle))); + buffer->StartLoading( + FetchDataLoader::CreateLoaderAsDataPipe(std::move(producer)), + new FetchLoaderClient(std::move(body_stream_handle))); return; } ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
diff --git a/third_party/WebKit/Source/platform/exported/WebServiceWorkerStreamHandle.cpp b/third_party/WebKit/Source/platform/exported/WebServiceWorkerStreamHandle.cpp index cef1a3ce..4627509 100644 --- a/third_party/WebKit/Source/platform/exported/WebServiceWorkerStreamHandle.cpp +++ b/third_party/WebKit/Source/platform/exported/WebServiceWorkerStreamHandle.cpp
@@ -24,8 +24,7 @@ mojo::ScopedDataPipeConsumerHandle WebServiceWorkerStreamHandle::DrainStreamDataPipe() { - // Temporary CHECK to debug https://crbug.com/734978. - CHECK(stream_.is_valid()); + DCHECK(stream_.is_valid()); return std::move(stream_); }
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h index 28301fb5..dea1483 100644 --- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h +++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerResponseError.h
@@ -10,23 +10,25 @@ // This enum is used in UMA histograms, so don't change the order or remove // entries. enum WebServiceWorkerResponseError { - kWebServiceWorkerResponseErrorUnknown, - kWebServiceWorkerResponseErrorPromiseRejected, - kWebServiceWorkerResponseErrorDefaultPrevented, - kWebServiceWorkerResponseErrorNoV8Instance, - kWebServiceWorkerResponseErrorResponseTypeError, - kWebServiceWorkerResponseErrorResponseTypeOpaque, - kWebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault, - kWebServiceWorkerResponseErrorBodyUsed, - kWebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest, - kWebServiceWorkerResponseErrorResponseTypeOpaqueRedirect, - kWebServiceWorkerResponseErrorBodyLocked, - kWebServiceWorkerResponseErrorNoForeignFetchResponse, - kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin, - kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin, - kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest, + kWebServiceWorkerResponseErrorUnknown = 0, + kWebServiceWorkerResponseErrorPromiseRejected = 1, + kWebServiceWorkerResponseErrorDefaultPrevented = 2, + kWebServiceWorkerResponseErrorNoV8Instance = 3, + kWebServiceWorkerResponseErrorResponseTypeError = 4, + kWebServiceWorkerResponseErrorResponseTypeOpaque = 5, + kWebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault = 6, + kWebServiceWorkerResponseErrorBodyUsed = 7, + kWebServiceWorkerResponseErrorResponseTypeOpaqueForClientRequest = 8, + kWebServiceWorkerResponseErrorResponseTypeOpaqueRedirect = 9, + kWebServiceWorkerResponseErrorBodyLocked = 10, + kWebServiceWorkerResponseErrorNoForeignFetchResponse = 11, + kWebServiceWorkerResponseErrorForeignFetchHeadersWithoutOrigin = 12, + kWebServiceWorkerResponseErrorForeignFetchMismatchedOrigin = 13, + kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest = 14, + kWebServiceWorkerResponseErrorDataPipeCreationFailed = 15, + // Add a new type here, and update the following line and enums.xml. kWebServiceWorkerResponseErrorLast = - kWebServiceWorkerResponseErrorRedirectedResponseForNotFollowRequest, + kWebServiceWorkerResponseErrorDataPipeCreationFailed, }; } // namespace blink
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerStreamHandle.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerStreamHandle.h index 7b508db..d643e46 100644 --- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerStreamHandle.h +++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerStreamHandle.h
@@ -30,8 +30,7 @@ #if INSIDE_BLINK WebServiceWorkerStreamHandle(mojo::ScopedDataPipeConsumerHandle stream) : stream_(std::move(stream)) { - // Temporary CHECK to debug https://crbug.com/734978. - CHECK(stream_.is_valid()); + DCHECK(stream_.is_valid()); } void Aborted(); void Completed();
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index c8e9e86..eb91c1a2 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -33164,6 +33164,7 @@ <int value="12" label="ForeignFetchHeadersWithoutOrigin"/> <int value="13" label="ForeignFetchMismatchedOrigin"/> <int value="14" label="RedirectedResponseForNotFollowRequest"/> + <int value="15" label="DataPipeCreationFailed (insufficient resources)"/> </enum> <enum name="ServiceWorkerSite">
diff --git a/ui/base/ime/chromeos/character_composer.cc b/ui/base/ime/chromeos/character_composer.cc index 1a647970..e0026255 100644 --- a/ui/base/ime/chromeos/character_composer.cc +++ b/ui/base/ime/chromeos/character_composer.cc
@@ -8,6 +8,7 @@ #include <iterator> #include "base/strings/string_util.h" +#include "base/strings/utf_string_conversion_utils.h" #include "base/strings/utf_string_conversions.h" #include "base/third_party/icu/icu_utf.h" #include "ui/events/event.h" @@ -126,6 +127,26 @@ // Key press is not a part of composition. compose_buffer_.pop_back(); // Remove the keypress added this time. if (!compose_buffer_.empty()) { + // Check for Windows-style composition fallback: If the dead key encodes + // a printable ASCII character, output that followed by the new keypress. + // (This could be extended to allow any printable Unicode character in + // the dead key, and/or for longer sequences, but there is no current use + // for that, so we keep it simple.) + if ((compose_buffer_.size() == 1) && (compose_buffer_[0].IsDeadKey())) { + int32_t dead_character = compose_buffer_[0].ToDeadKeyCombiningCharacter(); + if (dead_character >= 0x20 && dead_character <= 0x7E) { + DomKey current_key = event.GetDomKey(); + int32_t current_character = 0; + if (current_key.IsCharacter()) + current_character = current_key.ToCharacter(); + else if (current_key.IsDeadKey()) + current_character = current_key.ToDeadKeyCombiningCharacter(); + if (current_character) { + base::WriteUnicodeCharacter(dead_character, &composed_character_); + base::WriteUnicodeCharacter(current_character, &composed_character_); + } + } + } compose_buffer_.clear(); return true; }
diff --git a/ui/base/ime/chromeos/character_composer_data.h b/ui/base/ime/chromeos/character_composer_data.h index 95c8094..02244bf 100644 --- a/ui/base/ime/chromeos/character_composer_data.h +++ b/ui/base/ime/chromeos/character_composer_data.h
@@ -17,525 +17,535 @@ // leaf character table 0x0000, // number of entries // internal dead_key table - 0x0019, // number of entries + 0x001E, // number of entries 0x0000, // U+0000 - 0x0036, + 0x0040, + 0x0022, // quotation mark + 0x26FC, + 0x0027, // apostrophe + 0x2716, + 0x005E, // circumflex accent + 0x2738, + 0x0060, // grave accent + 0x2752, + 0x007E, // tilde + 0x2768, 0x0300, // combining grave accent - 0x26F2, + 0x2776, 0x0301, // combining acute accent - 0x28D0, + 0x2954, 0x0302, // combining circumflex accent - 0x2B62, + 0x2BE6, 0x0303, // combining tilde - 0x2CCC, + 0x2D50, 0x0304, // combining macron - 0x2E50, + 0x2ED4, 0x0306, // combining breve - 0x2F6C, + 0x2FF0, 0x0307, // combining dot above - 0x3022, + 0x30A6, 0x0308, // combining diaeresis - 0x30FA, + 0x317E, 0x0309, // combining hook above - 0x31F2, + 0x3276, 0x030A, // combining ring above - 0x32D2, + 0x3356, 0x030B, // combining double acute accent - 0x32F6, + 0x337A, 0x030C, // combining caron - 0x330C, + 0x3390, 0x030F, // combining double grave accent - 0x33A8, + 0x342C, 0x0311, // combining inverted breve - 0x33C8, + 0x344C, 0x0313, // combining comma above - 0x33E4, + 0x3468, 0x0314, // combining reversed comma above - 0x3404, + 0x3488, 0x031B, // combining horn - 0x3428, + 0x34AC, 0x0323, // combining dot below - 0x3498, + 0x351C, 0x0327, // combining cedilla - 0x3562, + 0x35E6, 0x0328, // combining ogonek - 0x35B6, + 0x363A, 0x0338, // combining long solidus overlay - 0x35E2, + 0x3666, 0x0345, // combining greek ypogegrammeni - 0x3656, + 0x36DA, 0x3099, // combining katakana-hiragana voiced sound mark - 0x3A30, + 0x3AB4, 0x309A, // combining katakana-hiragana semi-voiced sound mark - 0x3A94, + 0x3B18, // leaf dead_key table 0x0000, // number of entries - // offset 0x0036: + // offset 0x0040: // prefix: // Compose // internal character table 0x00E6, // number of entries 0x0020, // space - 0x0206, + 0x0210, 0x0021, // exclamation mark - 0x0220, + 0x022A, 0x0022, // quotation mark - 0x0296, + 0x02A0, 0x0023, // number sign - 0x0356, - 0x0025, // percent sign 0x0360, + 0x0025, // percent sign + 0x036A, 0x0027, // apostrophe - 0x0366, + 0x0370, 0x0028, // left parenthesis - 0x05BA, + 0x05C4, 0x0029, // right parenthesis - 0x0D88, + 0x0D92, 0x002A, // asterisk - 0x0DAC, + 0x0DB6, 0x002B, // plus sign - 0x0DBA, + 0x0DC4, 0x002C, // comma - 0x0DCA, + 0x0DD4, 0x002D, // hyphen-minus - 0x0E10, + 0x0E1A, 0x002E, // full stop - 0x0E54, + 0x0E5E, 0x002F, // solidus - 0x0EFE, + 0x0F08, 0x0030, // digit zero - 0x0F4A, + 0x0F54, 0x0031, // digit one - 0x0F5E, + 0x0F68, 0x0032, // digit two - 0x0F74, + 0x0F7E, 0x0033, // digit three - 0x0F82, + 0x0F8C, 0x0034, // digit four - 0x0F92, + 0x0F9C, 0x0035, // digit five - 0x0F98, + 0x0FA2, 0x0037, // digit seven - 0x0FA0, + 0x0FAA, 0x003A, // colon - 0x0FA6, - 0x003B, // semicolon 0x0FB0, + 0x003B, // semicolon + 0x0FBA, 0x003C, // less-than sign - 0x0FC8, + 0x0FD2, 0x003D, // equals sign - 0x1002, + 0x100C, 0x003E, // greater-than sign - 0x102E, + 0x1038, 0x003F, // question mark - 0x1052, + 0x105C, 0x0041, // capital a - 0x10D6, + 0x10E0, 0x0042, // capital b - 0x10FA, + 0x1104, 0x0043, // capital c - 0x1100, + 0x110A, 0x0044, // capital d - 0x112A, + 0x1134, 0x0045, // capital e - 0x1136, + 0x1140, 0x0046, // capital f - 0x1154, + 0x115E, 0x0047, // capital g - 0x115C, + 0x1166, 0x0049, // capital i - 0x116A, + 0x1174, 0x004B, // capital k - 0x1186, + 0x1190, 0x004C, // capital l - 0x118C, + 0x1196, 0x004D, // capital m - 0x119E, + 0x11A8, 0x004E, // capital n - 0x11A4, + 0x11AE, 0x004F, // capital o - 0x11BA, + 0x11C4, 0x0050, // capital p - 0x11E6, + 0x11F0, 0x0052, // capital r - 0x11F2, + 0x11FC, 0x0053, // capital s - 0x1200, + 0x120A, 0x0054, // capital t - 0x1220, + 0x122A, 0x0055, // capital u - 0x1232, + 0x123C, 0x0056, // capital v - 0x12C2, + 0x12CC, 0x0057, // capital w - 0x12C8, + 0x12D2, 0x0058, // capital x - 0x12D0, - 0x0059, // capital y 0x12DA, + 0x0059, // capital y + 0x12E4, 0x005A, // capital z - 0x12EC, - 0x005E, // circumflex accent 0x12F6, + 0x005E, // circumflex accent + 0x1300, 0x005F, // low line - 0x13CC, + 0x13D6, 0x0060, // grave accent - 0x14D4, + 0x14DE, 0x0061, // letter a - 0x1692, + 0x169C, 0x0062, // letter b - 0x16B4, + 0x16BE, 0x0063, // letter c - 0x172C, + 0x1736, 0x0064, // letter d - 0x179E, + 0x17A8, 0x0065, // letter e - 0x17AA, + 0x17B4, 0x0066, // letter f - 0x17CA, - 0x0067, // letter g 0x17D4, + 0x0067, // letter g + 0x17DE, 0x0069, // letter i - 0x17E2, + 0x17EC, 0x006B, // letter k - 0x17FE, + 0x1808, 0x006C, // letter l - 0x1806, + 0x1810, 0x006D, // letter m - 0x1818, - 0x006E, // letter n 0x1822, + 0x006E, // letter n + 0x182C, 0x006F, // letter o - 0x1832, + 0x183C, 0x0070, // letter p - 0x1874, + 0x187E, 0x0072, // letter r - 0x187C, - 0x0073, // letter s 0x1886, + 0x0073, // letter s + 0x1890, 0x0074, // letter t - 0x18A6, + 0x18B0, 0x0075, // letter u - 0x18B8, + 0x18C2, 0x0076, // letter v - 0x18D8, - 0x0077, // letter w 0x18E2, + 0x0077, // letter w + 0x18EC, 0x0078, // letter x - 0x18E8, + 0x18F2, 0x0079, // letter y - 0x18F4, + 0x18FE, 0x007A, // letter z - 0x1906, - 0x007C, // vertical line 0x1910, + 0x007C, // vertical line + 0x191A, 0x007E, // tilde - 0x1918, + 0x1922, 0x00A8, // diaeresis - 0x1A4E, + 0x1A58, 0x00AF, // macron - 0x1A78, + 0x1A82, 0x00B4, // acute accent - 0x1B58, + 0x1B62, 0x00B8, // cedilla - 0x1DAA, + 0x1DB4, 0x02D8, // breve - 0x1DDA, + 0x1DE4, 0x0391, // capital alpha - 0x1DE2, + 0x1DEC, 0x0395, // capital epsilon - 0x1DE8, + 0x1DF2, 0x0397, // capital eta - 0x1DEE, + 0x1DF8, 0x0399, // capital iota - 0x1DF4, + 0x1DFE, 0x039F, // capital omicron - 0x1DFC, + 0x1E06, 0x03A5, // capital upsilon - 0x1E02, + 0x1E0C, 0x03A9, // capital omega - 0x1E0A, + 0x1E14, 0x03B1, // letter alpha - 0x1E10, + 0x1E1A, 0x03B5, // letter epsilon - 0x1E16, + 0x1E20, 0x03B7, // letter eta - 0x1E1C, + 0x1E26, 0x03B9, // letter iota - 0x1E22, + 0x1E2C, 0x03BF, // letter omicron - 0x21E2, + 0x21EC, 0x03C5, // letter upsilon - 0x21E8, + 0x21F2, 0x03C9, // letter omega - 0x21F0, + 0x21FA, 0x0415, // cyrillic capital ie - 0x21F6, + 0x2200, 0x041D, // cyrillic capital en - 0x21FC, + 0x2206, 0x0421, // cyrillic capital es - 0x2204, + 0x220E, 0x043F, // cyrillic small pe - 0x220A, + 0x2214, 0x05B4, // hebrew point hiriq - 0x2210, + 0x221A, 0x05B7, // hebrew point patah - 0x2216, + 0x2220, 0x05B8, // hebrew point qamats - 0x221E, + 0x2228, 0x05B9, // hebrew point holam - 0x2224, + 0x222E, 0x05BC, // hebrew point dagesh or mapiq - 0x222A, + 0x2234, 0x061F, // arabic question mark - 0x225A, - 0x0621, // arabic hamza 0x2264, + 0x0621, // arabic hamza + 0x226E, 0x0622, // arabic alef with madda above - 0x2274, + 0x227E, 0x0653, // arabic maddah above - 0x2284, + 0x228E, 0x0654, // arabic hamza above - 0x228A, + 0x2294, 0x0655, // arabic hamza below - 0x229A, + 0x22A4, 0x093C, // devanagari sign nukta - 0x22A0, + 0x22AA, 0x09BC, // bengali sign nukta - 0x22BA, - 0x09C7, // bengali vowel sign e 0x22C4, + 0x09C7, // bengali vowel sign e + 0x22CE, 0x0A3C, // gurmukhi sign nukta - 0x22CC, + 0x22D6, 0x0B3C, // oriya sign nukta - 0x22DC, + 0x22E6, 0x0B47, // oriya vowel sign e - 0x22E4, - 0x0BC7, // tamil vowel sign ee 0x22EE, + 0x0BC7, // tamil vowel sign ee + 0x22F8, 0x0BD7, // tamil au length mark - 0x22F4, + 0x22FE, 0x0C46, // telugu vowel sign e - 0x22FA, + 0x2304, 0x0CBF, // kannada vowel sign i - 0x2300, + 0x230A, 0x0CC6, // kannada vowel sign e - 0x2306, - 0x0CCA, // kannada vowel sign o 0x2310, + 0x0CCA, // kannada vowel sign o + 0x231A, 0x0D46, // malayalam vowel sign e - 0x2316, + 0x2320, 0x0D47, // malayalam vowel sign ee - 0x231E, + 0x2328, 0x0DDC, // sinhala vowel sign kombuva haa aela-pilla - 0x2324, + 0x232E, 0x0E39, // thai character sara uu - 0x232A, - 0x0F71, // tibetan vowel sign aa 0x2334, - 0x0F90, // tibetan subjoined ka + 0x0F71, // tibetan vowel sign aa 0x233E, + 0x0F90, // tibetan subjoined ka + 0x2348, 0x0F92, // tibetan subjoined ga - 0x2344, + 0x234E, 0x0F9C, // tibetan subjoined dda - 0x234A, + 0x2354, 0x0FA1, // tibetan subjoined da - 0x2350, + 0x235A, 0x0FA6, // tibetan subjoined ba - 0x2356, + 0x2360, 0x0FAB, // tibetan subjoined dza - 0x235C, + 0x2366, 0x0FB2, // tibetan subjoined ra - 0x2362, + 0x236C, 0x0FB3, // tibetan subjoined la - 0x2368, + 0x2372, 0x0FB5, // tibetan subjoined ssa - 0x236E, + 0x2378, 0x0FB7, // tibetan subjoined ha - 0x2374, + 0x237E, 0x102E, // myanmar vowel sign ii - 0x2382, + 0x238C, 0x1100, // hangul choseong kiyeok - 0x2388, + 0x2392, 0x1102, // hangul choseong nieun - 0x238E, + 0x2398, 0x1103, // hangul choseong tikeut - 0x239A, + 0x23A4, 0x1105, // hangul choseong rieul - 0x23A2, + 0x23AC, 0x1106, // hangul choseong mieum - 0x23AE, + 0x23B8, 0x1107, // hangul choseong pieup - 0x23B6, + 0x23C0, 0x1108, // hangul choseong ssangpieup - 0x23DA, + 0x23E4, 0x1109, // hangul choseong sios - 0x23E0, + 0x23EA, 0x110A, // hangul choseong ssangsios - 0x2404, + 0x240E, 0x110B, // hangul choseong ieung - 0x240A, + 0x2414, 0x110C, // hangul choseong cieuc - 0x2424, + 0x242E, 0x110E, // hangul choseong chieuch - 0x242C, + 0x2436, 0x1111, // hangul choseong phieuph - 0x2434, + 0x243E, 0x1112, // hangul choseong hieuh - 0x243C, + 0x2446, 0x1121, // hangul choseong pieup-sios - 0x2442, + 0x244C, 0x1132, // hangul choseong sios-pieup - 0x2450, + 0x245A, 0x113C, // hangul choseong chitueumsios - 0x2456, + 0x2460, 0x113E, // hangul choseong ceongchieumsios - 0x245C, + 0x2466, 0x114E, // hangul choseong chitueumcieuc - 0x2462, + 0x246C, 0x1150, // hangul choseong ceongchieumcieuc - 0x2468, + 0x2472, 0x1161, // hangul jungseong a - 0x246E, - 0x1163, // hangul jungseong ya 0x2478, - 0x1165, // hangul jungseong eo + 0x1163, // hangul jungseong ya 0x2482, + 0x1165, // hangul jungseong eo + 0x248C, 0x1167, // hangul jungseong yeo - 0x248E, - 0x1169, // hangul jungseong o 0x2498, + 0x1169, // hangul jungseong o + 0x24A2, 0x116A, // hangul jungseong wa - 0x24AC, + 0x24B6, 0x116D, // hangul jungseong yo - 0x24B2, + 0x24BC, 0x116E, // hangul jungseong u - 0x24C0, + 0x24CA, 0x116F, // hangul jungseong weo - 0x24D4, + 0x24DE, 0x1172, // hangul jungseong yu - 0x24DC, + 0x24E6, 0x1173, // hangul jungseong eu - 0x24EE, - 0x1174, // hangul jungseong yi 0x24F8, + 0x1174, // hangul jungseong yi + 0x2502, 0x1175, // hangul jungseong i - 0x24FE, + 0x2508, 0x119E, // hangul jungseong araea - 0x250E, + 0x2518, 0x11A8, // hangul jongseong kiyeok - 0x251A, + 0x2524, 0x11AA, // hangul jongseong kiyeok-sios - 0x2526, + 0x2530, 0x11AB, // hangul jongseong nieun - 0x252C, + 0x2536, 0x11AE, // hangul jongseong tikeut - 0x253E, + 0x2548, 0x11AF, // hangul jongseong rieul - 0x2546, + 0x2550, 0x11B0, // hangul jongseong rieul-kiyeok - 0x2572, + 0x257C, 0x11B1, // hangul jongseong rieul-mieum - 0x2578, + 0x2582, 0x11B2, // hangul jongseong rieul-pieup - 0x2580, - 0x11B3, // hangul jongseong rieul-sios 0x258A, + 0x11B3, // hangul jongseong rieul-sios + 0x2594, 0x11B7, // hangul jongseong mieum - 0x2590, + 0x259A, 0x11B8, // hangul jongseong pieup - 0x25A6, + 0x25B0, 0x11BA, // hangul jongseong sios - 0x25B4, + 0x25BE, 0x11BC, // hangul jongseong ieung - 0x25C2, + 0x25CC, 0x11C1, // hangul jongseong phieuph - 0x25CE, + 0x25D8, 0x11C2, // hangul jongseong hieuh - 0x25D6, + 0x25E0, 0x11CE, // hangul jongseong rieul-tikeut - 0x25E2, + 0x25EC, 0x11DD, // hangul jongseong mieum-sios - 0x25E8, + 0x25F2, 0x11EC, // hangul jongseong ieung-kiyeok - 0x25EE, + 0x25F8, 0x11F0, // hangul jongseong yesieung - 0x25F4, + 0x25FE, 0x1FBF, // psili - 0x25FC, + 0x2606, 0x1FFE, // dasia - 0x260E, + 0x2618, 0x2203, // there exists - 0x2620, + 0x262A, 0x2208, // element of - 0x2626, + 0x2630, 0x220B, // contains as member - 0x262C, + 0x2636, 0x2223, // divides - 0x2632, + 0x263C, 0x2225, // parallel to - 0x2638, + 0x2642, 0x223C, // tilde operator - 0x263E, + 0x2648, 0x2243, // asymptotically equal to - 0x2644, + 0x264E, 0x2248, // almost equal to - 0x264A, + 0x2654, 0x224D, // equivalent to - 0x2650, + 0x265A, 0x2261, // identical to - 0x2656, + 0x2660, 0x2264, // less-than or equal to - 0x265C, + 0x2666, 0x2265, // greater-than or equal to - 0x2662, + 0x266C, 0x2272, // less-than or equivalent to - 0x2668, + 0x2672, 0x2273, // greater-than or equivalent to - 0x266E, + 0x2678, 0x2276, // less-than or greater-than - 0x2674, + 0x267E, 0x2277, // greater-than or less-than - 0x267A, + 0x2684, 0x227A, // precedes - 0x2680, + 0x268A, 0x227B, // succeeds - 0x2686, + 0x2690, 0x227C, // precedes or equal to - 0x268C, + 0x2696, 0x227D, // succeeds or equal to - 0x2692, + 0x269C, 0x2282, // subset of - 0x2698, + 0x26A2, 0x2283, // superset of - 0x269E, + 0x26A8, 0x2286, // subset of or equal to - 0x26A4, + 0x26AE, 0x2287, // superset of or equal to - 0x26AA, + 0x26B4, 0x2291, // square image of or equal to - 0x26B0, + 0x26BA, 0x2292, // square original of or equal to - 0x26B6, + 0x26C0, 0x22A2, // right tack - 0x26BC, + 0x26C6, 0x22A8, // true - 0x26C2, + 0x26CC, 0x22A9, // forces - 0x26C8, + 0x26D2, 0x22AB, // double vertical bar double right turnstile - 0x26CE, + 0x26D8, 0x22B2, // normal subgroup of - 0x26D4, + 0x26DE, 0x22B3, // contains as normal subgroup - 0x26DA, + 0x26E4, 0x22B4, // normal subgroup of or equal to - 0x26E0, + 0x26EA, 0x22B5, // contains as normal subgroup or equal to - 0x26E6, + 0x26F0, 0x2ADD, // nonforking - 0x26EC, + 0x26F6, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -543,7 +553,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0206: + // offset 0x0210: // prefix: // Compose // <space> @@ -578,14 +588,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0220: + // offset 0x022A: // prefix: // Compose // <exclamation mark> // internal character table 0x0001, // number of entries 0x002B, // plus sign - 0x027E, + 0x0288, // leaf character table 0x002B, // number of entries 0x0021, // exclamation mark @@ -677,11 +687,11 @@ // internal dead_key table 0x0001, // number of entries 0x031B, // combining horn - 0x028A, + 0x0294, // leaf dead_key table 0x0000, // number of entries - // offset 0x027E: + // offset 0x0288: // prefix: // Compose // <exclamation mark> @@ -703,7 +713,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x028A: + // offset 0x0294: // prefix: // Compose // <exclamation mark> @@ -725,20 +735,20 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0296: + // offset 0x02A0: // prefix: // Compose // <quotation mark> // internal character table 0x0004, // number of entries 0x0027, // apostrophe - 0x0324, - 0x005F, // low line 0x032E, + 0x005F, // low line + 0x0338, 0x007E, // tilde - 0x0336, + 0x0340, 0x00AF, // macron - 0x033E, + 0x0348, // leaf character table 0x003E, // number of entries 0x0022, // quotation mark @@ -868,15 +878,15 @@ // internal dead_key table 0x0002, // number of entries 0x0303, // combining tilde - 0x0346, + 0x0350, 0x0304, // combining macron - 0x034E, + 0x0358, // leaf dead_key table 0x0001, // number of entries 0x0301, // combining acute accent 0x0344, // -> combining greek dialytika tonos - // offset 0x0324: + // offset 0x032E: // prefix: // Compose // <quotation mark> @@ -896,7 +906,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x032E: + // offset 0x0338: // prefix: // Compose // <quotation mark> @@ -914,7 +924,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0336: + // offset 0x0340: // prefix: // Compose // <quotation mark> @@ -932,7 +942,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x033E: + // offset 0x0348: // prefix: // Compose // <quotation mark> @@ -950,7 +960,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0346: + // offset 0x0350: // prefix: // Compose // <quotation mark> @@ -968,7 +978,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x034E: + // offset 0x0358: // prefix: // Compose // <quotation mark> @@ -986,7 +996,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0356: + // offset 0x0360: // prefix: // Compose // <number sign> @@ -1005,7 +1015,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0360: + // offset 0x036A: // prefix: // Compose // <percent sign> @@ -1020,34 +1030,34 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0366: + // offset 0x0370: // prefix: // Compose // <apostrophe> // internal character table 0x000B, // number of entries 0x0022, // quotation mark - 0x0478, + 0x0482, 0x0028, // left parenthesis - 0x048A, + 0x0494, 0x0029, // right parenthesis - 0x04AA, + 0x04B4, 0x002B, // plus sign - 0x04C8, + 0x04D2, 0x002F, // solidus - 0x04D4, + 0x04DE, 0x005E, // circumflex accent - 0x04DC, + 0x04E6, 0x005F, // low line - 0x04EC, + 0x04F6, 0x0062, // letter b - 0x04F8, + 0x0502, 0x007E, // tilde - 0x0500, + 0x050A, 0x00AF, // macron - 0x050C, + 0x0516, 0x00B8, // cedilla - 0x0518, + 0x0522, // leaf character table 0x0072, // number of entries 0x0020, // space @@ -1281,29 +1291,29 @@ // internal dead_key table 0x000A, // number of entries 0x0302, // combining circumflex accent - 0x0520, + 0x052A, 0x0303, // combining tilde - 0x0530, + 0x053A, 0x0304, // combining macron - 0x053C, + 0x0546, 0x0306, // combining breve - 0x0548, + 0x0552, 0x0308, // combining diaeresis - 0x0550, + 0x055A, 0x030A, // combining ring above - 0x0560, + 0x056A, 0x0313, // combining comma above - 0x0568, + 0x0572, 0x0314, // combining reversed comma above - 0x0586, + 0x0590, 0x031B, // combining horn - 0x05A6, + 0x05B0, 0x0327, // combining cedilla - 0x05B2, + 0x05BC, // leaf dead_key table 0x0000, // number of entries - // offset 0x0478: + // offset 0x0482: // prefix: // Compose // <apostrophe> @@ -1331,7 +1341,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x048A: + // offset 0x0494: // prefix: // Compose // <apostrophe> @@ -1373,7 +1383,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x04AA: + // offset 0x04B4: // prefix: // Compose // <apostrophe> @@ -1413,7 +1423,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x04C8: + // offset 0x04D2: // prefix: // Compose // <apostrophe> @@ -1435,7 +1445,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x04D4: + // offset 0x04DE: // prefix: // Compose // <apostrophe> @@ -1453,7 +1463,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x04DC: + // offset 0x04E6: // prefix: // Compose // <apostrophe> @@ -1479,7 +1489,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x04EC: + // offset 0x04F6: // prefix: // Compose // <apostrophe> @@ -1501,7 +1511,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x04F8: + // offset 0x0502: // prefix: // Compose // <apostrophe> @@ -1519,7 +1529,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0500: + // offset 0x050A: // prefix: // Compose // <apostrophe> @@ -1541,7 +1551,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x050C: + // offset 0x0516: // prefix: // Compose // <apostrophe> @@ -1563,7 +1573,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0518: + // offset 0x0522: // prefix: // Compose // <apostrophe> @@ -1581,7 +1591,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0520: + // offset 0x052A: // prefix: // Compose // <apostrophe> @@ -1607,7 +1617,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0530: + // offset 0x053A: // prefix: // Compose // <apostrophe> @@ -1629,7 +1639,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x053C: + // offset 0x0546: // prefix: // Compose // <apostrophe> @@ -1651,7 +1661,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0548: + // offset 0x0552: // prefix: // Compose // <apostrophe> @@ -1669,7 +1679,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0550: + // offset 0x055A: // prefix: // Compose // <apostrophe> @@ -1695,7 +1705,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0560: + // offset 0x056A: // prefix: // Compose // <apostrophe> @@ -1713,7 +1723,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0568: + // offset 0x0572: // prefix: // Compose // <apostrophe> @@ -1753,7 +1763,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0586: + // offset 0x0590: // prefix: // Compose // <apostrophe> @@ -1795,7 +1805,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x05A6: + // offset 0x05B0: // prefix: // Compose // <apostrophe> @@ -1817,7 +1827,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x05B2: + // offset 0x05BC: // prefix: // Compose // <apostrophe> @@ -1835,358 +1845,358 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x05BA: + // offset 0x05C4: // prefix: // Compose // <left parenthesis> // internal character table 0x00AD, // number of entries 0x0020, // space - 0x074A, + 0x0754, 0x0030, // digit zero - 0x07A8, + 0x07B2, 0x0031, // digit one - 0x07AE, + 0x07B8, 0x0032, // digit two - 0x080C, + 0x0816, 0x0033, // digit three - 0x086A, + 0x0874, 0x0034, // digit four - 0x08C8, + 0x08D2, 0x0035, // digit five - 0x0926, + 0x0930, 0x0036, // digit six - 0x0934, + 0x093E, 0x0037, // digit seven - 0x093A, + 0x0944, 0x0038, // digit eight - 0x0940, + 0x094A, 0x0039, // digit nine - 0x0946, + 0x0950, 0x0041, // capital a - 0x094C, + 0x0956, 0x0042, // capital b - 0x0952, + 0x095C, 0x0043, // capital c - 0x0958, + 0x0962, 0x0044, // capital d - 0x095E, + 0x0968, 0x0045, // capital e - 0x0964, + 0x096E, 0x0046, // capital f - 0x096A, + 0x0974, 0x0047, // capital g - 0x0970, + 0x097A, 0x0048, // capital h - 0x0976, + 0x0980, 0x0049, // capital i - 0x097C, + 0x0986, 0x004A, // capital j - 0x0982, + 0x098C, 0x004B, // capital k - 0x0988, + 0x0992, 0x004C, // capital l - 0x098E, + 0x0998, 0x004D, // capital m - 0x0994, + 0x099E, 0x004E, // capital n - 0x099A, + 0x09A4, 0x004F, // capital o - 0x09A0, + 0x09AA, 0x0050, // capital p - 0x09A6, + 0x09B0, 0x0051, // capital q - 0x09AC, + 0x09B6, 0x0052, // capital r - 0x09B2, + 0x09BC, 0x0053, // capital s - 0x09B8, + 0x09C2, 0x0054, // capital t - 0x09BE, + 0x09C8, 0x0055, // capital u - 0x09C4, + 0x09CE, 0x0056, // capital v - 0x09CA, + 0x09D4, 0x0057, // capital w - 0x09D0, + 0x09DA, 0x0058, // capital x - 0x09D6, + 0x09E0, 0x0059, // capital y - 0x09DC, + 0x09E6, 0x005A, // capital z - 0x09E2, + 0x09EC, 0x0061, // letter a - 0x09E8, + 0x09F2, 0x0062, // letter b - 0x09EE, + 0x09F8, 0x0063, // letter c - 0x09F4, + 0x09FE, 0x0064, // letter d - 0x09FA, + 0x0A04, 0x0065, // letter e - 0x0A00, + 0x0A0A, 0x0066, // letter f - 0x0A06, + 0x0A10, 0x0067, // letter g - 0x0A0C, + 0x0A16, 0x0068, // letter h - 0x0A12, + 0x0A1C, 0x0069, // letter i - 0x0A18, + 0x0A22, 0x006A, // letter j - 0x0A1E, + 0x0A28, 0x006B, // letter k - 0x0A24, + 0x0A2E, 0x006C, // letter l - 0x0A2A, + 0x0A34, 0x006D, // letter m - 0x0A30, + 0x0A3A, 0x006E, // letter n - 0x0A36, + 0x0A40, 0x006F, // letter o - 0x0A3C, + 0x0A46, 0x0070, // letter p - 0x0A42, + 0x0A4C, 0x0071, // letter q - 0x0A48, + 0x0A52, 0x0072, // letter r - 0x0A4E, + 0x0A58, 0x0073, // letter s - 0x0A54, + 0x0A5E, 0x0074, // letter t - 0x0A5A, + 0x0A64, 0x0075, // letter u - 0x0A60, + 0x0A6A, 0x0076, // letter v - 0x0A66, + 0x0A70, 0x0077, // letter w - 0x0A6C, + 0x0A76, 0x0078, // letter x - 0x0A72, + 0x0A7C, 0x0079, // letter y - 0x0A78, + 0x0A82, 0x007A, // letter z - 0x0A7E, + 0x0A88, 0x1100, // hangul choseong kiyeok - 0x0A84, + 0x0A8E, 0x1102, // hangul choseong nieun - 0x0A92, + 0x0A9C, 0x1103, // hangul choseong tikeut - 0x0AA0, + 0x0AAA, 0x1105, // hangul choseong rieul - 0x0AAE, + 0x0AB8, 0x1106, // hangul choseong mieum - 0x0ABC, + 0x0AC6, 0x1107, // hangul choseong pieup - 0x0ACA, + 0x0AD4, 0x1109, // hangul choseong sios - 0x0AD8, + 0x0AE2, 0x110B, // hangul choseong ieung - 0x0AE6, + 0x0AF0, 0x110C, // hangul choseong cieuc - 0x0AF4, + 0x0AFE, 0x110E, // hangul choseong chieuch - 0x0B02, + 0x0B0C, 0x110F, // hangul choseong khieukh - 0x0B10, + 0x0B1A, 0x1110, // hangul choseong thieuth - 0x0B1E, + 0x0B28, 0x1111, // hangul choseong phieuph - 0x0B2C, + 0x0B36, 0x1112, // hangul choseong hieuh - 0x0B3A, + 0x0B44, 0x30A2, // katakana a - 0x0B48, + 0x0B52, 0x30A4, // katakana i - 0x0B4E, + 0x0B58, 0x30A6, // katakana u - 0x0B54, + 0x0B5E, 0x30A8, // katakana e - 0x0B5A, + 0x0B64, 0x30AA, // katakana o - 0x0B60, + 0x0B6A, 0x30AB, // katakana ka - 0x0B66, + 0x0B70, 0x30AD, // katakana ki - 0x0B6C, + 0x0B76, 0x30AF, // katakana ku - 0x0B72, + 0x0B7C, 0x30B1, // katakana ke - 0x0B78, + 0x0B82, 0x30B3, // katakana ko - 0x0B7E, + 0x0B88, 0x30B5, // katakana sa - 0x0B84, + 0x0B8E, 0x30B7, // katakana si - 0x0B8A, + 0x0B94, 0x30B9, // katakana su - 0x0B90, + 0x0B9A, 0x30BB, // katakana se - 0x0B96, + 0x0BA0, 0x30BD, // katakana so - 0x0B9C, + 0x0BA6, 0x30BF, // katakana ta - 0x0BA2, + 0x0BAC, 0x30C1, // katakana ti - 0x0BA8, + 0x0BB2, 0x30C4, // katakana tu - 0x0BAE, + 0x0BB8, 0x30C6, // katakana te - 0x0BB4, + 0x0BBE, 0x30C8, // katakana to - 0x0BBA, + 0x0BC4, 0x30CA, // katakana na - 0x0BC0, + 0x0BCA, 0x30CB, // katakana ni - 0x0BC6, + 0x0BD0, 0x30CC, // katakana nu - 0x0BCC, + 0x0BD6, 0x30CD, // katakana ne - 0x0BD2, + 0x0BDC, 0x30CE, // katakana no - 0x0BD8, + 0x0BE2, 0x30CF, // katakana ha - 0x0BDE, + 0x0BE8, 0x30D2, // katakana hi - 0x0BE4, + 0x0BEE, 0x30D5, // katakana hu - 0x0BEA, + 0x0BF4, 0x30D8, // katakana he - 0x0BF0, + 0x0BFA, 0x30DB, // katakana ho - 0x0BF6, + 0x0C00, 0x30DE, // katakana ma - 0x0BFC, + 0x0C06, 0x30DF, // katakana mi - 0x0C02, + 0x0C0C, 0x30E0, // katakana mu - 0x0C08, + 0x0C12, 0x30E1, // katakana me - 0x0C0E, + 0x0C18, 0x30E2, // katakana mo - 0x0C14, + 0x0C1E, 0x30E4, // katakana ya - 0x0C1A, + 0x0C24, 0x30E6, // katakana yu - 0x0C20, + 0x0C2A, 0x30E8, // katakana yo - 0x0C26, + 0x0C30, 0x30E9, // katakana ra - 0x0C2C, + 0x0C36, 0x30EA, // katakana ri - 0x0C32, + 0x0C3C, 0x30EB, // katakana ru - 0x0C38, + 0x0C42, 0x30EC, // katakana re - 0x0C3E, + 0x0C48, 0x30ED, // katakana ro - 0x0C44, + 0x0C4E, 0x30EF, // katakana wa - 0x0C4A, + 0x0C54, 0x30F0, // katakana wi - 0x0C50, + 0x0C5A, 0x30F1, // katakana we - 0x0C56, + 0x0C60, 0x30F2, // katakana wo - 0x0C5C, + 0x0C66, 0x4E00, // cjk unified ideograph-4e00 - 0x0C62, + 0x0C6C, 0x4E03, // cjk unified ideograph-4e03 - 0x0C68, + 0x0C72, 0x4E09, // cjk unified ideograph-4e09 - 0x0C6E, + 0x0C78, 0x4E0A, // cjk unified ideograph-4e0a - 0x0C74, + 0x0C7E, 0x4E0B, // cjk unified ideograph-4e0b - 0x0C7A, + 0x0C84, 0x4E2D, // cjk unified ideograph-4e2d - 0x0C80, + 0x0C8A, 0x4E5D, // cjk unified ideograph-4e5d - 0x0C86, + 0x0C90, 0x4E8C, // cjk unified ideograph-4e8c - 0x0C8C, + 0x0C96, 0x4E94, // cjk unified ideograph-4e94 - 0x0C92, + 0x0C9C, 0x4F01, // cjk unified ideograph-4f01 - 0x0C98, + 0x0CA2, 0x4F11, // cjk unified ideograph-4f11 - 0x0C9E, + 0x0CA8, 0x512A, // cjk unified ideograph-512a - 0x0CA4, + 0x0CAE, 0x516B, // cjk unified ideograph-516b - 0x0CAA, + 0x0CB4, 0x516D, // cjk unified ideograph-516d - 0x0CB0, + 0x0CBA, 0x5199, // cjk unified ideograph-5199 - 0x0CB6, + 0x0CC0, 0x52B4, // cjk unified ideograph-52b4 - 0x0CBC, + 0x0CC6, 0x533B, // cjk unified ideograph-533b - 0x0CC2, + 0x0CCC, 0x5341, // cjk unified ideograph-5341 - 0x0CC8, + 0x0CD2, 0x5354, // cjk unified ideograph-5354 - 0x0CCE, + 0x0CD8, 0x5370, // cjk unified ideograph-5370 - 0x0CD4, + 0x0CDE, 0x53F3, // cjk unified ideograph-53f3 - 0x0CDA, + 0x0CE4, 0x540D, // cjk unified ideograph-540d - 0x0CE0, + 0x0CEA, 0x56DB, // cjk unified ideograph-56db - 0x0CE6, + 0x0CF0, 0x571F, // cjk unified ideograph-571f - 0x0CEC, + 0x0CF6, 0x591C, // cjk unified ideograph-591c - 0x0CF2, + 0x0CFC, 0x5973, // cjk unified ideograph-5973 - 0x0CF8, + 0x0D02, 0x5B66, // cjk unified ideograph-5b66 - 0x0CFE, + 0x0D08, 0x5B97, // cjk unified ideograph-5b97 - 0x0D04, + 0x0D0E, 0x5DE6, // cjk unified ideograph-5de6 - 0x0D0A, + 0x0D14, 0x65E5, // cjk unified ideograph-65e5 - 0x0D10, + 0x0D1A, 0x6708, // cjk unified ideograph-6708 - 0x0D16, + 0x0D20, 0x6709, // cjk unified ideograph-6709 - 0x0D1C, + 0x0D26, 0x6728, // cjk unified ideograph-6728 - 0x0D22, + 0x0D2C, 0x682A, // cjk unified ideograph-682a - 0x0D28, + 0x0D32, 0x6B63, // cjk unified ideograph-6b63 - 0x0D2E, + 0x0D38, 0x6C34, // cjk unified ideograph-6c34 - 0x0D34, + 0x0D3E, 0x6CE8, // cjk unified ideograph-6ce8 - 0x0D3A, + 0x0D44, 0x706B, // cjk unified ideograph-706b - 0x0D40, + 0x0D4A, 0x7279, // cjk unified ideograph-7279 - 0x0D46, + 0x0D50, 0x7537, // cjk unified ideograph-7537 - 0x0D4C, + 0x0D56, 0x76E3, // cjk unified ideograph-76e3 - 0x0D52, + 0x0D5C, 0x793E, // cjk unified ideograph-793e - 0x0D58, + 0x0D62, 0x795D, // cjk unified ideograph-795d - 0x0D5E, + 0x0D68, 0x79D8, // cjk unified ideograph-79d8 - 0x0D64, + 0x0D6E, 0x8CA1, // cjk unified ideograph-8ca1 - 0x0D6A, + 0x0D74, 0x8CC7, // cjk unified ideograph-8cc7 - 0x0D70, + 0x0D7A, 0x9069, // cjk unified ideograph-9069 - 0x0D76, + 0x0D80, 0x91D1, // cjk unified ideograph-91d1 - 0x0D7C, + 0x0D86, 0x9805, // cjk unified ideograph-9805 - 0x0D82, + 0x0D8C, // leaf character table 0x0019, // number of entries 0x0020, // space @@ -2244,7 +2254,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x074A: + // offset 0x0754: // prefix: // Compose // <left parenthesis> @@ -2252,27 +2262,27 @@ // internal character table 0x000B, // number of entries 0x0020, // space - 0x0766, + 0x0770, 0x0030, // digit zero - 0x076C, + 0x0776, 0x0031, // digit one - 0x0772, + 0x077C, 0x0032, // digit two - 0x0778, + 0x0782, 0x0033, // digit three - 0x077E, + 0x0788, 0x0034, // digit four - 0x0784, + 0x078E, 0x0035, // digit five - 0x078A, + 0x0794, 0x0036, // digit six - 0x0790, + 0x079A, 0x0037, // digit seven - 0x0796, + 0x07A0, 0x0038, // digit eight - 0x079C, + 0x07A6, 0x0039, // digit nine - 0x07A2, + 0x07AC, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -2282,7 +2292,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0766: + // offset 0x0770: // prefix: // Compose // <left parenthesis> @@ -2299,7 +2309,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x076C: + // offset 0x0776: // prefix: // Compose // <left parenthesis> @@ -2316,7 +2326,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0772: + // offset 0x077C: // prefix: // Compose // <left parenthesis> @@ -2333,7 +2343,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0778: + // offset 0x0782: // prefix: // Compose // <left parenthesis> @@ -2350,7 +2360,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x077E: + // offset 0x0788: // prefix: // Compose // <left parenthesis> @@ -2367,7 +2377,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0784: + // offset 0x078E: // prefix: // Compose // <left parenthesis> @@ -2384,7 +2394,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x078A: + // offset 0x0794: // prefix: // Compose // <left parenthesis> @@ -2401,7 +2411,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0790: + // offset 0x079A: // prefix: // Compose // <left parenthesis> @@ -2418,7 +2428,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0796: + // offset 0x07A0: // prefix: // Compose // <left parenthesis> @@ -2435,7 +2445,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x079C: + // offset 0x07A6: // prefix: // Compose // <left parenthesis> @@ -2452,7 +2462,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07A2: + // offset 0x07AC: // prefix: // Compose // <left parenthesis> @@ -2469,7 +2479,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07A8: + // offset 0x07B2: // prefix: // Compose // <left parenthesis> @@ -2485,7 +2495,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07AE: + // offset 0x07B8: // prefix: // Compose // <left parenthesis> @@ -2493,27 +2503,27 @@ // internal character table 0x000B, // number of entries 0x0020, // space - 0x07CA, + 0x07D4, 0x0030, // digit zero - 0x07D0, + 0x07DA, 0x0031, // digit one - 0x07D6, + 0x07E0, 0x0032, // digit two - 0x07DC, + 0x07E6, 0x0033, // digit three - 0x07E2, + 0x07EC, 0x0034, // digit four - 0x07E8, + 0x07F2, 0x0035, // digit five - 0x07EE, + 0x07F8, 0x0036, // digit six - 0x07F4, + 0x07FE, 0x0037, // digit seven - 0x07FA, + 0x0804, 0x0038, // digit eight - 0x0800, + 0x080A, 0x0039, // digit nine - 0x0806, + 0x0810, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -2523,7 +2533,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07CA: + // offset 0x07D4: // prefix: // Compose // <left parenthesis> @@ -2540,7 +2550,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07D0: + // offset 0x07DA: // prefix: // Compose // <left parenthesis> @@ -2557,7 +2567,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07D6: + // offset 0x07E0: // prefix: // Compose // <left parenthesis> @@ -2574,7 +2584,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07DC: + // offset 0x07E6: // prefix: // Compose // <left parenthesis> @@ -2591,7 +2601,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07E2: + // offset 0x07EC: // prefix: // Compose // <left parenthesis> @@ -2608,7 +2618,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07E8: + // offset 0x07F2: // prefix: // Compose // <left parenthesis> @@ -2625,7 +2635,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07EE: + // offset 0x07F8: // prefix: // Compose // <left parenthesis> @@ -2642,7 +2652,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07F4: + // offset 0x07FE: // prefix: // Compose // <left parenthesis> @@ -2659,7 +2669,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x07FA: + // offset 0x0804: // prefix: // Compose // <left parenthesis> @@ -2676,7 +2686,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0800: + // offset 0x080A: // prefix: // Compose // <left parenthesis> @@ -2693,7 +2703,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0806: + // offset 0x0810: // prefix: // Compose // <left parenthesis> @@ -2710,7 +2720,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x080C: + // offset 0x0816: // prefix: // Compose // <left parenthesis> @@ -2718,27 +2728,27 @@ // internal character table 0x000B, // number of entries 0x0020, // space - 0x0828, + 0x0832, 0x0030, // digit zero - 0x082E, + 0x0838, 0x0031, // digit one - 0x0834, + 0x083E, 0x0032, // digit two - 0x083A, + 0x0844, 0x0033, // digit three - 0x0840, + 0x084A, 0x0034, // digit four - 0x0846, + 0x0850, 0x0035, // digit five - 0x084C, + 0x0856, 0x0036, // digit six - 0x0852, + 0x085C, 0x0037, // digit seven - 0x0858, + 0x0862, 0x0038, // digit eight - 0x085E, + 0x0868, 0x0039, // digit nine - 0x0864, + 0x086E, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -2748,7 +2758,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0828: + // offset 0x0832: // prefix: // Compose // <left parenthesis> @@ -2765,7 +2775,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x082E: + // offset 0x0838: // prefix: // Compose // <left parenthesis> @@ -2782,7 +2792,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0834: + // offset 0x083E: // prefix: // Compose // <left parenthesis> @@ -2799,7 +2809,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x083A: + // offset 0x0844: // prefix: // Compose // <left parenthesis> @@ -2816,7 +2826,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0840: + // offset 0x084A: // prefix: // Compose // <left parenthesis> @@ -2833,7 +2843,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0846: + // offset 0x0850: // prefix: // Compose // <left parenthesis> @@ -2850,7 +2860,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x084C: + // offset 0x0856: // prefix: // Compose // <left parenthesis> @@ -2867,7 +2877,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0852: + // offset 0x085C: // prefix: // Compose // <left parenthesis> @@ -2884,7 +2894,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0858: + // offset 0x0862: // prefix: // Compose // <left parenthesis> @@ -2901,7 +2911,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x085E: + // offset 0x0868: // prefix: // Compose // <left parenthesis> @@ -2918,7 +2928,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0864: + // offset 0x086E: // prefix: // Compose // <left parenthesis> @@ -2935,7 +2945,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x086A: + // offset 0x0874: // prefix: // Compose // <left parenthesis> @@ -2943,27 +2953,27 @@ // internal character table 0x000B, // number of entries 0x0020, // space - 0x0886, + 0x0890, 0x0030, // digit zero - 0x088C, + 0x0896, 0x0031, // digit one - 0x0892, + 0x089C, 0x0032, // digit two - 0x0898, + 0x08A2, 0x0033, // digit three - 0x089E, + 0x08A8, 0x0034, // digit four - 0x08A4, + 0x08AE, 0x0035, // digit five - 0x08AA, + 0x08B4, 0x0036, // digit six - 0x08B0, + 0x08BA, 0x0037, // digit seven - 0x08B6, + 0x08C0, 0x0038, // digit eight - 0x08BC, + 0x08C6, 0x0039, // digit nine - 0x08C2, + 0x08CC, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -2973,7 +2983,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0886: + // offset 0x0890: // prefix: // Compose // <left parenthesis> @@ -2990,7 +3000,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x088C: + // offset 0x0896: // prefix: // Compose // <left parenthesis> @@ -3007,7 +3017,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0892: + // offset 0x089C: // prefix: // Compose // <left parenthesis> @@ -3024,7 +3034,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0898: + // offset 0x08A2: // prefix: // Compose // <left parenthesis> @@ -3041,7 +3051,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x089E: + // offset 0x08A8: // prefix: // Compose // <left parenthesis> @@ -3058,7 +3068,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08A4: + // offset 0x08AE: // prefix: // Compose // <left parenthesis> @@ -3075,7 +3085,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08AA: + // offset 0x08B4: // prefix: // Compose // <left parenthesis> @@ -3092,7 +3102,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08B0: + // offset 0x08BA: // prefix: // Compose // <left parenthesis> @@ -3109,7 +3119,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08B6: + // offset 0x08C0: // prefix: // Compose // <left parenthesis> @@ -3126,7 +3136,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08BC: + // offset 0x08C6: // prefix: // Compose // <left parenthesis> @@ -3143,7 +3153,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08C2: + // offset 0x08CC: // prefix: // Compose // <left parenthesis> @@ -3160,7 +3170,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08C8: + // offset 0x08D2: // prefix: // Compose // <left parenthesis> @@ -3168,27 +3178,27 @@ // internal character table 0x000B, // number of entries 0x0020, // space - 0x08E4, + 0x08EE, 0x0030, // digit zero - 0x08EA, + 0x08F4, 0x0031, // digit one - 0x08F0, + 0x08FA, 0x0032, // digit two - 0x08F6, + 0x0900, 0x0033, // digit three - 0x08FC, + 0x0906, 0x0034, // digit four - 0x0902, + 0x090C, 0x0035, // digit five - 0x0908, + 0x0912, 0x0036, // digit six - 0x090E, + 0x0918, 0x0037, // digit seven - 0x0914, + 0x091E, 0x0038, // digit eight - 0x091A, + 0x0924, 0x0039, // digit nine - 0x0920, + 0x092A, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -3198,7 +3208,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08E4: + // offset 0x08EE: // prefix: // Compose // <left parenthesis> @@ -3215,7 +3225,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08EA: + // offset 0x08F4: // prefix: // Compose // <left parenthesis> @@ -3232,7 +3242,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08F0: + // offset 0x08FA: // prefix: // Compose // <left parenthesis> @@ -3249,7 +3259,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08F6: + // offset 0x0900: // prefix: // Compose // <left parenthesis> @@ -3266,7 +3276,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x08FC: + // offset 0x0906: // prefix: // Compose // <left parenthesis> @@ -3283,7 +3293,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0902: + // offset 0x090C: // prefix: // Compose // <left parenthesis> @@ -3300,7 +3310,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0908: + // offset 0x0912: // prefix: // Compose // <left parenthesis> @@ -3317,7 +3327,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x090E: + // offset 0x0918: // prefix: // Compose // <left parenthesis> @@ -3334,7 +3344,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0914: + // offset 0x091E: // prefix: // Compose // <left parenthesis> @@ -3351,7 +3361,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x091A: + // offset 0x0924: // prefix: // Compose // <left parenthesis> @@ -3368,7 +3378,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0920: + // offset 0x092A: // prefix: // Compose // <left parenthesis> @@ -3385,7 +3395,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0926: + // offset 0x0930: // prefix: // Compose // <left parenthesis> @@ -3393,7 +3403,7 @@ // internal character table 0x0001, // number of entries 0x0030, // digit zero - 0x092E, + 0x0938, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -3403,7 +3413,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x092E: + // offset 0x0938: // prefix: // Compose // <left parenthesis> @@ -3420,7 +3430,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0934: + // offset 0x093E: // prefix: // Compose // <left parenthesis> @@ -3436,7 +3446,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x093A: + // offset 0x0944: // prefix: // Compose // <left parenthesis> @@ -3452,7 +3462,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0940: + // offset 0x094A: // prefix: // Compose // <left parenthesis> @@ -3468,7 +3478,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0946: + // offset 0x0950: // prefix: // Compose // <left parenthesis> @@ -3484,7 +3494,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x094C: + // offset 0x0956: // prefix: // Compose // <left parenthesis> @@ -3500,7 +3510,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0952: + // offset 0x095C: // prefix: // Compose // <left parenthesis> @@ -3516,7 +3526,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0958: + // offset 0x0962: // prefix: // Compose // <left parenthesis> @@ -3532,7 +3542,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x095E: + // offset 0x0968: // prefix: // Compose // <left parenthesis> @@ -3548,7 +3558,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0964: + // offset 0x096E: // prefix: // Compose // <left parenthesis> @@ -3564,7 +3574,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x096A: + // offset 0x0974: // prefix: // Compose // <left parenthesis> @@ -3580,7 +3590,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0970: + // offset 0x097A: // prefix: // Compose // <left parenthesis> @@ -3596,7 +3606,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0976: + // offset 0x0980: // prefix: // Compose // <left parenthesis> @@ -3612,7 +3622,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x097C: + // offset 0x0986: // prefix: // Compose // <left parenthesis> @@ -3628,7 +3638,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0982: + // offset 0x098C: // prefix: // Compose // <left parenthesis> @@ -3644,7 +3654,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0988: + // offset 0x0992: // prefix: // Compose // <left parenthesis> @@ -3660,7 +3670,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x098E: + // offset 0x0998: // prefix: // Compose // <left parenthesis> @@ -3676,7 +3686,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0994: + // offset 0x099E: // prefix: // Compose // <left parenthesis> @@ -3692,7 +3702,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x099A: + // offset 0x09A4: // prefix: // Compose // <left parenthesis> @@ -3708,7 +3718,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09A0: + // offset 0x09AA: // prefix: // Compose // <left parenthesis> @@ -3724,7 +3734,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09A6: + // offset 0x09B0: // prefix: // Compose // <left parenthesis> @@ -3740,7 +3750,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09AC: + // offset 0x09B6: // prefix: // Compose // <left parenthesis> @@ -3756,7 +3766,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09B2: + // offset 0x09BC: // prefix: // Compose // <left parenthesis> @@ -3772,7 +3782,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09B8: + // offset 0x09C2: // prefix: // Compose // <left parenthesis> @@ -3788,7 +3798,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09BE: + // offset 0x09C8: // prefix: // Compose // <left parenthesis> @@ -3804,7 +3814,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09C4: + // offset 0x09CE: // prefix: // Compose // <left parenthesis> @@ -3820,7 +3830,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09CA: + // offset 0x09D4: // prefix: // Compose // <left parenthesis> @@ -3836,7 +3846,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09D0: + // offset 0x09DA: // prefix: // Compose // <left parenthesis> @@ -3852,7 +3862,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09D6: + // offset 0x09E0: // prefix: // Compose // <left parenthesis> @@ -3868,7 +3878,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09DC: + // offset 0x09E6: // prefix: // Compose // <left parenthesis> @@ -3884,7 +3894,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09E2: + // offset 0x09EC: // prefix: // Compose // <left parenthesis> @@ -3900,7 +3910,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09E8: + // offset 0x09F2: // prefix: // Compose // <left parenthesis> @@ -3916,7 +3926,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09EE: + // offset 0x09F8: // prefix: // Compose // <left parenthesis> @@ -3932,7 +3942,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09F4: + // offset 0x09FE: // prefix: // Compose // <left parenthesis> @@ -3948,7 +3958,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x09FA: + // offset 0x0A04: // prefix: // Compose // <left parenthesis> @@ -3964,7 +3974,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A00: + // offset 0x0A0A: // prefix: // Compose // <left parenthesis> @@ -3980,7 +3990,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A06: + // offset 0x0A10: // prefix: // Compose // <left parenthesis> @@ -3996,7 +4006,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A0C: + // offset 0x0A16: // prefix: // Compose // <left parenthesis> @@ -4012,7 +4022,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A12: + // offset 0x0A1C: // prefix: // Compose // <left parenthesis> @@ -4028,7 +4038,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A18: + // offset 0x0A22: // prefix: // Compose // <left parenthesis> @@ -4044,7 +4054,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A1E: + // offset 0x0A28: // prefix: // Compose // <left parenthesis> @@ -4060,7 +4070,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A24: + // offset 0x0A2E: // prefix: // Compose // <left parenthesis> @@ -4076,7 +4086,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A2A: + // offset 0x0A34: // prefix: // Compose // <left parenthesis> @@ -4092,7 +4102,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A30: + // offset 0x0A3A: // prefix: // Compose // <left parenthesis> @@ -4108,7 +4118,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A36: + // offset 0x0A40: // prefix: // Compose // <left parenthesis> @@ -4124,7 +4134,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A3C: + // offset 0x0A46: // prefix: // Compose // <left parenthesis> @@ -4140,7 +4150,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A42: + // offset 0x0A4C: // prefix: // Compose // <left parenthesis> @@ -4156,7 +4166,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A48: + // offset 0x0A52: // prefix: // Compose // <left parenthesis> @@ -4172,7 +4182,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A4E: + // offset 0x0A58: // prefix: // Compose // <left parenthesis> @@ -4188,7 +4198,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A54: + // offset 0x0A5E: // prefix: // Compose // <left parenthesis> @@ -4204,7 +4214,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A5A: + // offset 0x0A64: // prefix: // Compose // <left parenthesis> @@ -4220,7 +4230,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A60: + // offset 0x0A6A: // prefix: // Compose // <left parenthesis> @@ -4236,7 +4246,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A66: + // offset 0x0A70: // prefix: // Compose // <left parenthesis> @@ -4252,7 +4262,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A6C: + // offset 0x0A76: // prefix: // Compose // <left parenthesis> @@ -4268,7 +4278,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A72: + // offset 0x0A7C: // prefix: // Compose // <left parenthesis> @@ -4284,7 +4294,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A78: + // offset 0x0A82: // prefix: // Compose // <left parenthesis> @@ -4300,7 +4310,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A7E: + // offset 0x0A88: // prefix: // Compose // <left parenthesis> @@ -4316,7 +4326,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A84: + // offset 0x0A8E: // prefix: // Compose // <left parenthesis> @@ -4324,7 +4334,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0A8C, + 0x0A96, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4334,7 +4344,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A8C: + // offset 0x0A96: // prefix: // Compose // <left parenthesis> @@ -4351,7 +4361,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A92: + // offset 0x0A9C: // prefix: // Compose // <left parenthesis> @@ -4359,7 +4369,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0A9A, + 0x0AA4, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4369,7 +4379,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0A9A: + // offset 0x0AA4: // prefix: // Compose // <left parenthesis> @@ -4386,7 +4396,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AA0: + // offset 0x0AAA: // prefix: // Compose // <left parenthesis> @@ -4394,7 +4404,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AA8, + 0x0AB2, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4404,7 +4414,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AA8: + // offset 0x0AB2: // prefix: // Compose // <left parenthesis> @@ -4421,7 +4431,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AAE: + // offset 0x0AB8: // prefix: // Compose // <left parenthesis> @@ -4429,7 +4439,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AB6, + 0x0AC0, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4439,7 +4449,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AB6: + // offset 0x0AC0: // prefix: // Compose // <left parenthesis> @@ -4456,7 +4466,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0ABC: + // offset 0x0AC6: // prefix: // Compose // <left parenthesis> @@ -4464,7 +4474,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AC4, + 0x0ACE, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4474,7 +4484,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AC4: + // offset 0x0ACE: // prefix: // Compose // <left parenthesis> @@ -4491,7 +4501,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0ACA: + // offset 0x0AD4: // prefix: // Compose // <left parenthesis> @@ -4499,7 +4509,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AD2, + 0x0ADC, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4509,7 +4519,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AD2: + // offset 0x0ADC: // prefix: // Compose // <left parenthesis> @@ -4526,7 +4536,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AD8: + // offset 0x0AE2: // prefix: // Compose // <left parenthesis> @@ -4534,7 +4544,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AE0, + 0x0AEA, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4544,7 +4554,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AE0: + // offset 0x0AEA: // prefix: // Compose // <left parenthesis> @@ -4561,7 +4571,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AE6: + // offset 0x0AF0: // prefix: // Compose // <left parenthesis> @@ -4569,7 +4579,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AEE, + 0x0AF8, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4579,7 +4589,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AEE: + // offset 0x0AF8: // prefix: // Compose // <left parenthesis> @@ -4596,7 +4606,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AF4: + // offset 0x0AFE: // prefix: // Compose // <left parenthesis> @@ -4604,7 +4614,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0AFC, + 0x0B06, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4614,7 +4624,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0AFC: + // offset 0x0B06: // prefix: // Compose // <left parenthesis> @@ -4631,7 +4641,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B02: + // offset 0x0B0C: // prefix: // Compose // <left parenthesis> @@ -4639,7 +4649,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0B0A, + 0x0B14, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4649,7 +4659,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B0A: + // offset 0x0B14: // prefix: // Compose // <left parenthesis> @@ -4666,7 +4676,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B10: + // offset 0x0B1A: // prefix: // Compose // <left parenthesis> @@ -4674,7 +4684,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0B18, + 0x0B22, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4684,7 +4694,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B18: + // offset 0x0B22: // prefix: // Compose // <left parenthesis> @@ -4701,7 +4711,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B1E: + // offset 0x0B28: // prefix: // Compose // <left parenthesis> @@ -4709,7 +4719,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0B26, + 0x0B30, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4719,7 +4729,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B26: + // offset 0x0B30: // prefix: // Compose // <left parenthesis> @@ -4736,7 +4746,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B2C: + // offset 0x0B36: // prefix: // Compose // <left parenthesis> @@ -4744,7 +4754,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0B34, + 0x0B3E, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4754,7 +4764,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B34: + // offset 0x0B3E: // prefix: // Compose // <left parenthesis> @@ -4771,7 +4781,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B3A: + // offset 0x0B44: // prefix: // Compose // <left parenthesis> @@ -4779,7 +4789,7 @@ // internal character table 0x0001, // number of entries 0x1161, // hangul jungseong a - 0x0B42, + 0x0B4C, // leaf character table 0x0001, // number of entries 0x0029, // right parenthesis @@ -4789,7 +4799,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B42: + // offset 0x0B4C: // prefix: // Compose // <left parenthesis> @@ -4806,7 +4816,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B48: + // offset 0x0B52: // prefix: // Compose // <left parenthesis> @@ -4822,7 +4832,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B4E: + // offset 0x0B58: // prefix: // Compose // <left parenthesis> @@ -4838,7 +4848,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B54: + // offset 0x0B5E: // prefix: // Compose // <left parenthesis> @@ -4854,7 +4864,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B5A: + // offset 0x0B64: // prefix: // Compose // <left parenthesis> @@ -4870,7 +4880,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B60: + // offset 0x0B6A: // prefix: // Compose // <left parenthesis> @@ -4886,7 +4896,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B66: + // offset 0x0B70: // prefix: // Compose // <left parenthesis> @@ -4902,7 +4912,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B6C: + // offset 0x0B76: // prefix: // Compose // <left parenthesis> @@ -4918,7 +4928,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B72: + // offset 0x0B7C: // prefix: // Compose // <left parenthesis> @@ -4934,7 +4944,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B78: + // offset 0x0B82: // prefix: // Compose // <left parenthesis> @@ -4950,7 +4960,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B7E: + // offset 0x0B88: // prefix: // Compose // <left parenthesis> @@ -4966,7 +4976,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B84: + // offset 0x0B8E: // prefix: // Compose // <left parenthesis> @@ -4982,7 +4992,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B8A: + // offset 0x0B94: // prefix: // Compose // <left parenthesis> @@ -4998,7 +5008,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B90: + // offset 0x0B9A: // prefix: // Compose // <left parenthesis> @@ -5014,7 +5024,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B96: + // offset 0x0BA0: // prefix: // Compose // <left parenthesis> @@ -5030,7 +5040,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0B9C: + // offset 0x0BA6: // prefix: // Compose // <left parenthesis> @@ -5046,7 +5056,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BA2: + // offset 0x0BAC: // prefix: // Compose // <left parenthesis> @@ -5062,7 +5072,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BA8: + // offset 0x0BB2: // prefix: // Compose // <left parenthesis> @@ -5078,7 +5088,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BAE: + // offset 0x0BB8: // prefix: // Compose // <left parenthesis> @@ -5094,7 +5104,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BB4: + // offset 0x0BBE: // prefix: // Compose // <left parenthesis> @@ -5110,7 +5120,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BBA: + // offset 0x0BC4: // prefix: // Compose // <left parenthesis> @@ -5126,7 +5136,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BC0: + // offset 0x0BCA: // prefix: // Compose // <left parenthesis> @@ -5142,7 +5152,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BC6: + // offset 0x0BD0: // prefix: // Compose // <left parenthesis> @@ -5158,7 +5168,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BCC: + // offset 0x0BD6: // prefix: // Compose // <left parenthesis> @@ -5174,7 +5184,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BD2: + // offset 0x0BDC: // prefix: // Compose // <left parenthesis> @@ -5190,7 +5200,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BD8: + // offset 0x0BE2: // prefix: // Compose // <left parenthesis> @@ -5206,7 +5216,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BDE: + // offset 0x0BE8: // prefix: // Compose // <left parenthesis> @@ -5222,7 +5232,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BE4: + // offset 0x0BEE: // prefix: // Compose // <left parenthesis> @@ -5238,7 +5248,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BEA: + // offset 0x0BF4: // prefix: // Compose // <left parenthesis> @@ -5254,7 +5264,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BF0: + // offset 0x0BFA: // prefix: // Compose // <left parenthesis> @@ -5270,7 +5280,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BF6: + // offset 0x0C00: // prefix: // Compose // <left parenthesis> @@ -5286,7 +5296,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0BFC: + // offset 0x0C06: // prefix: // Compose // <left parenthesis> @@ -5302,7 +5312,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C02: + // offset 0x0C0C: // prefix: // Compose // <left parenthesis> @@ -5318,7 +5328,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C08: + // offset 0x0C12: // prefix: // Compose // <left parenthesis> @@ -5334,7 +5344,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C0E: + // offset 0x0C18: // prefix: // Compose // <left parenthesis> @@ -5350,7 +5360,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C14: + // offset 0x0C1E: // prefix: // Compose // <left parenthesis> @@ -5366,7 +5376,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C1A: + // offset 0x0C24: // prefix: // Compose // <left parenthesis> @@ -5382,7 +5392,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C20: + // offset 0x0C2A: // prefix: // Compose // <left parenthesis> @@ -5398,7 +5408,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C26: + // offset 0x0C30: // prefix: // Compose // <left parenthesis> @@ -5414,7 +5424,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C2C: + // offset 0x0C36: // prefix: // Compose // <left parenthesis> @@ -5430,7 +5440,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C32: + // offset 0x0C3C: // prefix: // Compose // <left parenthesis> @@ -5446,7 +5456,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C38: + // offset 0x0C42: // prefix: // Compose // <left parenthesis> @@ -5462,7 +5472,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C3E: + // offset 0x0C48: // prefix: // Compose // <left parenthesis> @@ -5478,7 +5488,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C44: + // offset 0x0C4E: // prefix: // Compose // <left parenthesis> @@ -5494,7 +5504,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C4A: + // offset 0x0C54: // prefix: // Compose // <left parenthesis> @@ -5510,7 +5520,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C50: + // offset 0x0C5A: // prefix: // Compose // <left parenthesis> @@ -5526,7 +5536,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C56: + // offset 0x0C60: // prefix: // Compose // <left parenthesis> @@ -5542,7 +5552,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C5C: + // offset 0x0C66: // prefix: // Compose // <left parenthesis> @@ -5558,7 +5568,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C62: + // offset 0x0C6C: // prefix: // Compose // <left parenthesis> @@ -5574,7 +5584,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C68: + // offset 0x0C72: // prefix: // Compose // <left parenthesis> @@ -5590,7 +5600,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C6E: + // offset 0x0C78: // prefix: // Compose // <left parenthesis> @@ -5606,7 +5616,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C74: + // offset 0x0C7E: // prefix: // Compose // <left parenthesis> @@ -5622,7 +5632,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C7A: + // offset 0x0C84: // prefix: // Compose // <left parenthesis> @@ -5638,7 +5648,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C80: + // offset 0x0C8A: // prefix: // Compose // <left parenthesis> @@ -5654,7 +5664,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C86: + // offset 0x0C90: // prefix: // Compose // <left parenthesis> @@ -5670,7 +5680,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C8C: + // offset 0x0C96: // prefix: // Compose // <left parenthesis> @@ -5686,7 +5696,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C92: + // offset 0x0C9C: // prefix: // Compose // <left parenthesis> @@ -5702,7 +5712,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C98: + // offset 0x0CA2: // prefix: // Compose // <left parenthesis> @@ -5718,7 +5728,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0C9E: + // offset 0x0CA8: // prefix: // Compose // <left parenthesis> @@ -5734,7 +5744,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CA4: + // offset 0x0CAE: // prefix: // Compose // <left parenthesis> @@ -5750,7 +5760,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CAA: + // offset 0x0CB4: // prefix: // Compose // <left parenthesis> @@ -5766,7 +5776,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CB0: + // offset 0x0CBA: // prefix: // Compose // <left parenthesis> @@ -5782,7 +5792,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CB6: + // offset 0x0CC0: // prefix: // Compose // <left parenthesis> @@ -5798,7 +5808,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CBC: + // offset 0x0CC6: // prefix: // Compose // <left parenthesis> @@ -5814,7 +5824,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CC2: + // offset 0x0CCC: // prefix: // Compose // <left parenthesis> @@ -5830,7 +5840,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CC8: + // offset 0x0CD2: // prefix: // Compose // <left parenthesis> @@ -5846,7 +5856,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CCE: + // offset 0x0CD8: // prefix: // Compose // <left parenthesis> @@ -5862,7 +5872,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CD4: + // offset 0x0CDE: // prefix: // Compose // <left parenthesis> @@ -5878,7 +5888,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CDA: + // offset 0x0CE4: // prefix: // Compose // <left parenthesis> @@ -5894,7 +5904,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CE0: + // offset 0x0CEA: // prefix: // Compose // <left parenthesis> @@ -5910,7 +5920,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CE6: + // offset 0x0CF0: // prefix: // Compose // <left parenthesis> @@ -5926,7 +5936,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CEC: + // offset 0x0CF6: // prefix: // Compose // <left parenthesis> @@ -5942,7 +5952,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CF2: + // offset 0x0CFC: // prefix: // Compose // <left parenthesis> @@ -5958,7 +5968,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CF8: + // offset 0x0D02: // prefix: // Compose // <left parenthesis> @@ -5974,7 +5984,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0CFE: + // offset 0x0D08: // prefix: // Compose // <left parenthesis> @@ -5990,7 +6000,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D04: + // offset 0x0D0E: // prefix: // Compose // <left parenthesis> @@ -6006,7 +6016,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D0A: + // offset 0x0D14: // prefix: // Compose // <left parenthesis> @@ -6022,7 +6032,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D10: + // offset 0x0D1A: // prefix: // Compose // <left parenthesis> @@ -6038,7 +6048,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D16: + // offset 0x0D20: // prefix: // Compose // <left parenthesis> @@ -6054,7 +6064,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D1C: + // offset 0x0D26: // prefix: // Compose // <left parenthesis> @@ -6070,7 +6080,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D22: + // offset 0x0D2C: // prefix: // Compose // <left parenthesis> @@ -6086,7 +6096,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D28: + // offset 0x0D32: // prefix: // Compose // <left parenthesis> @@ -6102,7 +6112,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D2E: + // offset 0x0D38: // prefix: // Compose // <left parenthesis> @@ -6118,7 +6128,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D34: + // offset 0x0D3E: // prefix: // Compose // <left parenthesis> @@ -6134,7 +6144,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D3A: + // offset 0x0D44: // prefix: // Compose // <left parenthesis> @@ -6150,7 +6160,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D40: + // offset 0x0D4A: // prefix: // Compose // <left parenthesis> @@ -6166,7 +6176,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D46: + // offset 0x0D50: // prefix: // Compose // <left parenthesis> @@ -6182,7 +6192,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D4C: + // offset 0x0D56: // prefix: // Compose // <left parenthesis> @@ -6198,7 +6208,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D52: + // offset 0x0D5C: // prefix: // Compose // <left parenthesis> @@ -6214,7 +6224,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D58: + // offset 0x0D62: // prefix: // Compose // <left parenthesis> @@ -6230,7 +6240,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D5E: + // offset 0x0D68: // prefix: // Compose // <left parenthesis> @@ -6246,7 +6256,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D64: + // offset 0x0D6E: // prefix: // Compose // <left parenthesis> @@ -6262,7 +6272,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D6A: + // offset 0x0D74: // prefix: // Compose // <left parenthesis> @@ -6278,7 +6288,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D70: + // offset 0x0D7A: // prefix: // Compose // <left parenthesis> @@ -6294,7 +6304,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D76: + // offset 0x0D80: // prefix: // Compose // <left parenthesis> @@ -6310,7 +6320,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D7C: + // offset 0x0D86: // prefix: // Compose // <left parenthesis> @@ -6326,7 +6336,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D82: + // offset 0x0D8C: // prefix: // Compose // <left parenthesis> @@ -6342,7 +6352,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0D88: + // offset 0x0D92: // prefix: // Compose // <right parenthesis> @@ -6387,7 +6397,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0DAC: + // offset 0x0DB6: // prefix: // Compose // <asterisk> @@ -6410,7 +6420,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0DBA: + // offset 0x0DC4: // prefix: // Compose // <plus sign> @@ -6435,7 +6445,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0DCA: + // offset 0x0DD4: // prefix: // Compose // <comma> @@ -6514,14 +6524,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0E10: + // offset 0x0E1A: // prefix: // Compose // <hyphen-minus> // internal character table 0x0001, // number of entries 0x002D, // hyphen-minus - 0x0E4A, + 0x0E54, // leaf character table 0x001A, // number of entries 0x0020, // space @@ -6581,7 +6591,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0E4A: + // offset 0x0E54: // prefix: // Compose // <hyphen-minus> @@ -6601,18 +6611,18 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0E54: + // offset 0x0E5E: // prefix: // Compose // <full stop> // internal character table 0x0003, // number of entries 0x0021, // exclamation mark - 0x0ECE, + 0x0ED8, 0x0027, // apostrophe - 0x0ED6, + 0x0EE0, 0x00B4, // acute accent - 0x0EDE, + 0x0EE8, // leaf character table 0x0035, // number of entries 0x002D, // hyphen-minus @@ -6724,15 +6734,15 @@ // internal dead_key table 0x0003, // number of entries 0x0301, // combining acute accent - 0x0EE6, + 0x0EF0, 0x030C, // combining caron - 0x0EEE, + 0x0EF8, 0x0323, // combining dot below - 0x0EF6, + 0x0F00, // leaf dead_key table 0x0000, // number of entries - // offset 0x0ECE: + // offset 0x0ED8: // prefix: // Compose // <full stop> @@ -6750,7 +6760,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0ED6: + // offset 0x0EE0: // prefix: // Compose // <full stop> @@ -6768,7 +6778,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0EDE: + // offset 0x0EE8: // prefix: // Compose // <full stop> @@ -6786,7 +6796,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0EE6: + // offset 0x0EF0: // prefix: // Compose // <full stop> @@ -6804,7 +6814,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0EEE: + // offset 0x0EF8: // prefix: // Compose // <full stop> @@ -6822,7 +6832,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0EF6: + // offset 0x0F00: // prefix: // Compose // <full stop> @@ -6840,7 +6850,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0EFE: + // offset 0x0F08: // prefix: // Compose // <solidus> @@ -6925,7 +6935,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0F4A: + // offset 0x0F54: // prefix: // Compose // <digit zero> @@ -6954,7 +6964,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0F5E: + // offset 0x0F68: // prefix: // Compose // <digit one> @@ -6985,7 +6995,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0F74: + // offset 0x0F7E: // prefix: // Compose // <digit two> @@ -7008,7 +7018,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0F82: + // offset 0x0F8C: // prefix: // Compose // <digit three> @@ -7033,7 +7043,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0F92: + // offset 0x0F9C: // prefix: // Compose // <digit four> @@ -7048,7 +7058,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0F98: + // offset 0x0FA2: // prefix: // Compose // <digit five> @@ -7065,7 +7075,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0FA0: + // offset 0x0FAA: // prefix: // Compose // <digit seven> @@ -7080,7 +7090,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0FA6: + // offset 0x0FB0: // prefix: // Compose // <colon> @@ -7099,7 +7109,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0FB0: + // offset 0x0FBA: // prefix: // Compose // <semicolon> @@ -7132,7 +7142,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x0FC8: + // offset 0x0FD2: // prefix: // Compose // <less-than sign> @@ -7199,7 +7209,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1002: + // offset 0x100C: // prefix: // Compose // <equals sign> @@ -7252,7 +7262,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x102E: + // offset 0x1038: // prefix: // Compose // <greater-than sign> @@ -7297,18 +7307,18 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1052: + // offset 0x105C: // prefix: // Compose // <question mark> // internal character table 0x0003, // number of entries 0x002B, // plus sign - 0x108E, + 0x1098, 0x005E, // circumflex accent - 0x109A, + 0x10A4, 0x0062, // letter b - 0x10AA, + 0x10B4, // leaf character table 0x0016, // number of entries 0x0021, // exclamation mark @@ -7358,15 +7368,15 @@ // internal dead_key table 0x0003, // number of entries 0x0302, // combining circumflex accent - 0x10B2, + 0x10BC, 0x0306, // combining breve - 0x10C2, + 0x10CC, 0x031B, // combining horn - 0x10CA, + 0x10D4, // leaf dead_key table 0x0000, // number of entries - // offset 0x108E: + // offset 0x1098: // prefix: // Compose // <question mark> @@ -7388,7 +7398,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x109A: + // offset 0x10A4: // prefix: // Compose // <question mark> @@ -7414,7 +7424,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x10AA: + // offset 0x10B4: // prefix: // Compose // <question mark> @@ -7432,7 +7442,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x10B2: + // offset 0x10BC: // prefix: // Compose // <question mark> @@ -7458,7 +7468,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x10C2: + // offset 0x10CC: // prefix: // Compose // <question mark> @@ -7476,7 +7486,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x10CA: + // offset 0x10D4: // prefix: // Compose // <question mark> @@ -7498,7 +7508,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x10D6: + // offset 0x10E0: // prefix: // Compose // <latin capital letter a> @@ -7543,7 +7553,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x10FA: + // offset 0x1104: // prefix: // Compose // <latin capital letter b> @@ -7558,14 +7568,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1100: + // offset 0x110A: // prefix: // Compose // <latin capital letter c> // internal character table 0x0001, // number of entries 0x0043, // capital c - 0x111E, + 0x1128, // leaf character table 0x000C, // number of entries 0x0027, // apostrophe @@ -7597,7 +7607,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x111E: + // offset 0x1128: // prefix: // Compose // <latin capital letter c> @@ -7605,7 +7615,7 @@ // internal character table 0x0001, // number of entries 0x0043, // capital c - 0x1124, + 0x112E, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -7613,7 +7623,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1124: + // offset 0x112E: // prefix: // Compose // <latin capital letter c> @@ -7630,7 +7640,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x112A: + // offset 0x1134: // prefix: // Compose // <latin capital letter d> @@ -7651,7 +7661,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1136: + // offset 0x1140: // prefix: // Compose // <latin capital letter e> @@ -7690,7 +7700,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1154: + // offset 0x115E: // prefix: // Compose // <latin capital letter f> @@ -7707,7 +7717,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x115C: + // offset 0x1166: // prefix: // Compose // <latin capital letter g> @@ -7730,7 +7740,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x116A: + // offset 0x1174: // prefix: // Compose // <latin capital letter i> @@ -7767,7 +7777,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1186: + // offset 0x1190: // prefix: // Compose // <latin capital letter k> @@ -7782,7 +7792,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x118C: + // offset 0x1196: // prefix: // Compose // <latin capital letter l> @@ -7809,7 +7819,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x119E: + // offset 0x11A8: // prefix: // Compose // <latin capital letter m> @@ -7824,7 +7834,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x11A4: + // offset 0x11AE: // prefix: // Compose // <latin capital letter n> @@ -7855,7 +7865,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x11BA: + // offset 0x11C4: // prefix: // Compose // <latin capital letter o> @@ -7908,7 +7918,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x11E6: + // offset 0x11F0: // prefix: // Compose // <latin capital letter p> @@ -7929,7 +7939,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x11F2: + // offset 0x11FC: // prefix: // Compose // <latin capital letter r> @@ -7952,7 +7962,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1200: + // offset 0x120A: // prefix: // Compose // <latin capital letter s> @@ -7993,7 +8003,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1220: + // offset 0x122A: // prefix: // Compose // <latin capital letter t> @@ -8020,18 +8030,18 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1232: + // offset 0x123C: // prefix: // Compose // <latin capital letter u> // internal character table 0x0003, // number of entries 0x0021, // exclamation mark - 0x129A, + 0x12A4, 0x002C, // comma - 0x12A2, + 0x12AC, 0x00B8, // cedilla - 0x12AA, + 0x12B4, // leaf character table 0x002D, // number of entries 0x0022, // quotation mark @@ -8127,13 +8137,13 @@ // internal dead_key table 0x0002, // number of entries 0x0323, // combining dot below - 0x12B2, + 0x12BC, 0x0327, // combining cedilla - 0x12BA, + 0x12C4, // leaf dead_key table 0x0000, // number of entries - // offset 0x129A: + // offset 0x12A4: // prefix: // Compose // <latin capital letter u> @@ -8151,7 +8161,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12A2: + // offset 0x12AC: // prefix: // Compose // <latin capital letter u> @@ -8169,7 +8179,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12AA: + // offset 0x12B4: // prefix: // Compose // <latin capital letter u> @@ -8187,7 +8197,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12B2: + // offset 0x12BC: // prefix: // Compose // <latin capital letter u> @@ -8205,7 +8215,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12BA: + // offset 0x12C4: // prefix: // Compose // <latin capital letter u> @@ -8223,7 +8233,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12C2: + // offset 0x12CC: // prefix: // Compose // <latin capital letter v> @@ -8238,7 +8248,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12C8: + // offset 0x12D2: // prefix: // Compose // <latin capital letter w> @@ -8255,7 +8265,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12D0: + // offset 0x12DA: // prefix: // Compose // <latin capital letter x> @@ -8274,7 +8284,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12DA: + // offset 0x12E4: // prefix: // Compose // <latin capital letter y> @@ -8301,7 +8311,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12EC: + // offset 0x12F6: // prefix: // Compose // <latin capital letter z> @@ -8320,16 +8330,16 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x12F6: + // offset 0x1300: // prefix: // Compose // <circumflex accent> // internal character table 0x0002, // number of entries 0x0021, // exclamation mark - 0x1384, + 0x138E, 0x005F, // low line - 0x1394, + 0x139E, // leaf character table 0x0042, // number of entries 0x0020, // space @@ -8467,11 +8477,11 @@ // internal dead_key table 0x0001, // number of entries 0x0323, // combining dot below - 0x13BC, + 0x13C6, // leaf dead_key table 0x0000, // number of entries - // offset 0x1384: + // offset 0x138E: // prefix: // Compose // <circumflex accent> @@ -8497,7 +8507,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1394: + // offset 0x139E: // prefix: // Compose // <circumflex accent> @@ -8547,7 +8557,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x13BC: + // offset 0x13C6: // prefix: // Compose // <circumflex accent> @@ -8573,22 +8583,22 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x13CC: + // offset 0x13D6: // prefix: // Compose // <low line> // internal character table 0x0005, // number of entries 0x0021, // exclamation mark - 0x1464, + 0x146E, 0x0022, // quotation mark - 0x1470, + 0x147A, 0x002E, // full stop - 0x1480, + 0x148A, 0x003B, // semicolon - 0x148C, + 0x1496, 0x007E, // tilde - 0x1494, + 0x149E, // leaf character table 0x0040, // number of entries 0x0020, // space @@ -8722,19 +8732,19 @@ // internal dead_key table 0x0005, // number of entries 0x0303, // combining tilde - 0x149C, + 0x14A6, 0x0307, // combining dot above - 0x14A4, + 0x14AE, 0x0308, // combining diaeresis - 0x14B0, + 0x14BA, 0x0323, // combining dot below - 0x14C0, + 0x14CA, 0x0328, // combining ogonek - 0x14CC, + 0x14D6, // leaf dead_key table 0x0000, // number of entries - // offset 0x1464: + // offset 0x146E: // prefix: // Compose // <low line> @@ -8756,7 +8766,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1470: + // offset 0x147A: // prefix: // Compose // <low line> @@ -8782,7 +8792,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1480: + // offset 0x148A: // prefix: // Compose // <low line> @@ -8804,7 +8814,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x148C: + // offset 0x1496: // prefix: // Compose // <low line> @@ -8822,7 +8832,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1494: + // offset 0x149E: // prefix: // Compose // <low line> @@ -8840,7 +8850,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x149C: + // offset 0x14A6: // prefix: // Compose // <low line> @@ -8858,7 +8868,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x14A4: + // offset 0x14AE: // prefix: // Compose // <low line> @@ -8880,7 +8890,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x14B0: + // offset 0x14BA: // prefix: // Compose // <low line> @@ -8906,7 +8916,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x14C0: + // offset 0x14CA: // prefix: // Compose // <low line> @@ -8928,7 +8938,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x14CC: + // offset 0x14D6: // prefix: // Compose // <low line> @@ -8946,28 +8956,28 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x14D4: + // offset 0x14DE: // prefix: // Compose // <grave accent> // internal character table 0x0008, // number of entries 0x0022, // quotation mark - 0x1592, + 0x159C, 0x0028, // left parenthesis - 0x159E, + 0x15A8, 0x0029, // right parenthesis - 0x15BE, + 0x15C8, 0x002B, // plus sign - 0x15DC, + 0x15E6, 0x005E, // circumflex accent - 0x15E8, + 0x15F2, 0x005F, // low line - 0x15F8, + 0x1602, 0x0062, // letter b - 0x1604, + 0x160E, 0x00AF, // macron - 0x160C, + 0x1616, // leaf character table 0x004E, // number of entries 0x0020, // space @@ -9129,23 +9139,23 @@ // internal dead_key table 0x0007, // number of entries 0x0302, // combining circumflex accent - 0x1618, + 0x1622, 0x0304, // combining macron - 0x1628, + 0x1632, 0x0306, // combining breve - 0x1634, + 0x163E, 0x0308, // combining diaeresis - 0x163C, + 0x1646, 0x0313, // combining comma above - 0x1648, + 0x1652, 0x0314, // combining reversed comma above - 0x1666, + 0x1670, 0x031B, // combining horn - 0x1686, + 0x1690, // leaf dead_key table 0x0000, // number of entries - // offset 0x1592: + // offset 0x159C: // prefix: // Compose // <grave accent> @@ -9167,7 +9177,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x159E: + // offset 0x15A8: // prefix: // Compose // <grave accent> @@ -9209,7 +9219,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x15BE: + // offset 0x15C8: // prefix: // Compose // <grave accent> @@ -9249,7 +9259,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x15DC: + // offset 0x15E6: // prefix: // Compose // <grave accent> @@ -9271,7 +9281,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x15E8: + // offset 0x15F2: // prefix: // Compose // <grave accent> @@ -9297,7 +9307,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x15F8: + // offset 0x1602: // prefix: // Compose // <grave accent> @@ -9319,7 +9329,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1604: + // offset 0x160E: // prefix: // Compose // <grave accent> @@ -9337,7 +9347,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x160C: + // offset 0x1616: // prefix: // Compose // <grave accent> @@ -9359,7 +9369,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1618: + // offset 0x1622: // prefix: // Compose // <grave accent> @@ -9385,7 +9395,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1628: + // offset 0x1632: // prefix: // Compose // <grave accent> @@ -9407,7 +9417,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1634: + // offset 0x163E: // prefix: // Compose // <grave accent> @@ -9425,7 +9435,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x163C: + // offset 0x1646: // prefix: // Compose // <grave accent> @@ -9447,7 +9457,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1648: + // offset 0x1652: // prefix: // Compose // <grave accent> @@ -9487,7 +9497,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1666: + // offset 0x1670: // prefix: // Compose // <grave accent> @@ -9529,7 +9539,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1686: + // offset 0x1690: // prefix: // Compose // <grave accent> @@ -9551,7 +9561,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1692: + // offset 0x169C: // prefix: // Compose // <latin small letter a> @@ -9594,18 +9604,18 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x16B4: + // offset 0x16BE: // prefix: // Compose // <latin small letter b> // internal character table 0x0003, // number of entries 0x0021, // exclamation mark - 0x1704, + 0x170E, 0x002C, // comma - 0x170C, + 0x1716, 0x00B8, // cedilla - 0x1714, + 0x171E, // leaf character table 0x0021, // number of entries 0x002E, // full stop @@ -9677,13 +9687,13 @@ // internal dead_key table 0x0002, // number of entries 0x0323, // combining dot below - 0x171C, + 0x1726, 0x0327, // combining cedilla - 0x1724, + 0x172E, // leaf dead_key table 0x0000, // number of entries - // offset 0x1704: + // offset 0x170E: // prefix: // Compose // <latin small letter b> @@ -9701,7 +9711,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x170C: + // offset 0x1716: // prefix: // Compose // <latin small letter b> @@ -9719,7 +9729,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1714: + // offset 0x171E: // prefix: // Compose // <latin small letter b> @@ -9737,7 +9747,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x171C: + // offset 0x1726: // prefix: // Compose // <latin small letter b> @@ -9755,7 +9765,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1724: + // offset 0x172E: // prefix: // Compose // <latin small letter b> @@ -9773,14 +9783,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x172C: + // offset 0x1736: // prefix: // Compose // <latin small letter c> // internal character table 0x0001, // number of entries 0x0022, // quotation mark - 0x178E, + 0x1798, // leaf character table 0x002D, // number of entries 0x0027, // apostrophe @@ -9876,11 +9886,11 @@ // internal dead_key table 0x0001, // number of entries 0x0308, // combining diaeresis - 0x1796, + 0x17A0, // leaf dead_key table 0x0000, // number of entries - // offset 0x178E: + // offset 0x1798: // prefix: // Compose // <latin small letter c> @@ -9898,7 +9908,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1796: + // offset 0x17A0: // prefix: // Compose // <latin small letter c> @@ -9916,7 +9926,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x179E: + // offset 0x17A8: // prefix: // Compose // <latin small letter d> @@ -9937,7 +9947,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x17AA: + // offset 0x17B4: // prefix: // Compose // <latin small letter e> @@ -9978,7 +9988,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x17CA: + // offset 0x17D4: // prefix: // Compose // <latin small letter f> @@ -9997,7 +10007,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x17D4: + // offset 0x17DE: // prefix: // Compose // <latin small letter g> @@ -10020,7 +10030,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x17E2: + // offset 0x17EC: // prefix: // Compose // <latin small letter i> @@ -10057,7 +10067,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x17FE: + // offset 0x1808: // prefix: // Compose // <latin small letter k> @@ -10074,7 +10084,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1806: + // offset 0x1810: // prefix: // Compose // <latin small letter l> @@ -10101,7 +10111,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1818: + // offset 0x1822: // prefix: // Compose // <latin small letter m> @@ -10120,7 +10130,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1822: + // offset 0x182C: // prefix: // Compose // <latin small letter n> @@ -10145,14 +10155,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1832: + // offset 0x183C: // prefix: // Compose // <latin small letter o> // internal character table 0x0001, // number of entries 0x0027, // apostrophe - 0x186C, + 0x1876, // leaf character table 0x001A, // number of entries 0x0022, // quotation mark @@ -10212,7 +10222,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x186C: + // offset 0x1876: // prefix: // Compose // <latin small letter o> @@ -10230,7 +10240,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1874: + // offset 0x187E: // prefix: // Compose // <latin small letter p> @@ -10247,7 +10257,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x187C: + // offset 0x1886: // prefix: // Compose // <latin small letter r> @@ -10266,7 +10276,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1886: + // offset 0x1890: // prefix: // Compose // <latin small letter s> @@ -10307,7 +10317,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x18A6: + // offset 0x18B0: // prefix: // Compose // <latin small letter t> @@ -10334,7 +10344,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x18B8: + // offset 0x18C2: // prefix: // Compose // <latin small letter u> @@ -10375,7 +10385,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x18D8: + // offset 0x18E2: // prefix: // Compose // <latin small letter v> @@ -10394,7 +10404,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x18E2: + // offset 0x18EC: // prefix: // Compose // <latin small letter w> @@ -10409,7 +10419,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x18E8: + // offset 0x18F2: // prefix: // Compose // <latin small letter x> @@ -10430,7 +10440,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x18F4: + // offset 0x18FE: // prefix: // Compose // <latin small letter y> @@ -10457,7 +10467,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1906: + // offset 0x1910: // prefix: // Compose // <latin small letter z> @@ -10476,7 +10486,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1910: + // offset 0x191A: // prefix: // Compose // <vertical line> @@ -10493,24 +10503,24 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1918: + // offset 0x1922: // prefix: // Compose // <tilde> // internal character table 0x0006, // number of entries 0x0022, // quotation mark - 0x199A, + 0x19A4, 0x0028, // left parenthesis - 0x19A2, + 0x19AC, 0x0029, // right parenthesis - 0x19BA, + 0x19C4, 0x002B, // plus sign - 0x19D0, + 0x19DA, 0x005E, // circumflex accent - 0x19DC, + 0x19E6, 0x0062, // letter b - 0x19EC, + 0x19F6, // leaf character table 0x0033, // number of entries 0x0020, // space @@ -10618,21 +10628,21 @@ // internal dead_key table 0x0006, // number of entries 0x0302, // combining circumflex accent - 0x19F4, + 0x19FE, 0x0306, // combining breve - 0x1A04, + 0x1A0E, 0x0308, // combining diaeresis - 0x1A0C, + 0x1A16, 0x0313, // combining comma above - 0x1A14, + 0x1A1E, 0x0314, // combining reversed comma above - 0x1A2A, + 0x1A34, 0x031B, // combining horn - 0x1A42, + 0x1A4C, // leaf dead_key table 0x0000, // number of entries - // offset 0x199A: + // offset 0x19A4: // prefix: // Compose // <tilde> @@ -10650,7 +10660,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x19A2: + // offset 0x19AC: // prefix: // Compose // <tilde> @@ -10684,7 +10694,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x19BA: + // offset 0x19C4: // prefix: // Compose // <tilde> @@ -10716,7 +10726,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x19D0: + // offset 0x19DA: // prefix: // Compose // <tilde> @@ -10738,7 +10748,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x19DC: + // offset 0x19E6: // prefix: // Compose // <tilde> @@ -10764,7 +10774,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x19EC: + // offset 0x19F6: // prefix: // Compose // <tilde> @@ -10782,7 +10792,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x19F4: + // offset 0x19FE: // prefix: // Compose // <tilde> @@ -10808,7 +10818,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1A04: + // offset 0x1A0E: // prefix: // Compose // <tilde> @@ -10826,7 +10836,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1A0C: + // offset 0x1A16: // prefix: // Compose // <tilde> @@ -10844,7 +10854,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1A14: + // offset 0x1A1E: // prefix: // Compose // <tilde> @@ -10876,7 +10886,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1A2A: + // offset 0x1A34: // prefix: // Compose // <tilde> @@ -10910,7 +10920,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1A42: + // offset 0x1A4C: // prefix: // Compose // <tilde> @@ -10932,7 +10942,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1A4E: + // offset 0x1A58: // prefix: // Compose // <diaeresis> @@ -10983,22 +10993,22 @@ 0x0303, // combining tilde 0x1FC1, // -> dialytika and perispomeni - // offset 0x1A78: + // offset 0x1A82: // prefix: // Compose // <macron> // internal character table 0x0005, // number of entries 0x0021, // exclamation mark - 0x1AE8, + 0x1AF2, 0x0022, // quotation mark - 0x1AF4, + 0x1AFE, 0x002E, // full stop - 0x1B04, + 0x1B0E, 0x003B, // semicolon - 0x1B10, + 0x1B1A, 0x007E, // tilde - 0x1B18, + 0x1B22, // leaf character table 0x002C, // number of entries 0x0041, // capital a @@ -11092,19 +11102,19 @@ // internal dead_key table 0x0005, // number of entries 0x0303, // combining tilde - 0x1B20, + 0x1B2A, 0x0307, // combining dot above - 0x1B28, + 0x1B32, 0x0308, // combining diaeresis - 0x1B34, + 0x1B3E, 0x0323, // combining dot below - 0x1B44, + 0x1B4E, 0x0328, // combining ogonek - 0x1B50, + 0x1B5A, // leaf dead_key table 0x0000, // number of entries - // offset 0x1AE8: + // offset 0x1AF2: // prefix: // Compose // <macron> @@ -11126,7 +11136,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1AF4: + // offset 0x1AFE: // prefix: // Compose // <macron> @@ -11152,7 +11162,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B04: + // offset 0x1B0E: // prefix: // Compose // <macron> @@ -11174,7 +11184,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B10: + // offset 0x1B1A: // prefix: // Compose // <macron> @@ -11192,7 +11202,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B18: + // offset 0x1B22: // prefix: // Compose // <macron> @@ -11210,7 +11220,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B20: + // offset 0x1B2A: // prefix: // Compose // <macron> @@ -11228,7 +11238,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B28: + // offset 0x1B32: // prefix: // Compose // <macron> @@ -11250,7 +11260,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B34: + // offset 0x1B3E: // prefix: // Compose // <macron> @@ -11276,7 +11286,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B44: + // offset 0x1B4E: // prefix: // Compose // <macron> @@ -11298,7 +11308,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B50: + // offset 0x1B5A: // prefix: // Compose // <macron> @@ -11316,36 +11326,36 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1B58: + // offset 0x1B62: // prefix: // Compose // <acute accent> // internal character table 0x000C, // number of entries 0x0022, // quotation mark - 0x1C62, + 0x1C6C, 0x0028, // left parenthesis - 0x1C72, + 0x1C7C, 0x0029, // right parenthesis - 0x1C92, + 0x1C9C, 0x002B, // plus sign - 0x1CB0, + 0x1CBA, 0x002C, // comma - 0x1CBC, + 0x1CC6, 0x002F, // solidus - 0x1CC4, + 0x1CCE, 0x005E, // circumflex accent - 0x1CCC, + 0x1CD6, 0x005F, // low line - 0x1CDC, + 0x1CE6, 0x0062, // letter b - 0x1CE8, + 0x1CF2, 0x007E, // tilde - 0x1CF0, + 0x1CFA, 0x00AF, // macron - 0x1CFC, + 0x1D06, 0x00B8, // cedilla - 0x1D08, + 0x1D12, // leaf character table 0x006D, // number of entries 0x0041, // capital a @@ -11569,29 +11579,29 @@ // internal dead_key table 0x000A, // number of entries 0x0302, // combining circumflex accent - 0x1D10, + 0x1D1A, 0x0303, // combining tilde - 0x1D20, + 0x1D2A, 0x0304, // combining macron - 0x1D2C, + 0x1D36, 0x0306, // combining breve - 0x1D38, + 0x1D42, 0x0308, // combining diaeresis - 0x1D40, + 0x1D4A, 0x030A, // combining ring above - 0x1D50, + 0x1D5A, 0x0313, // combining comma above - 0x1D58, + 0x1D62, 0x0314, // combining reversed comma above - 0x1D76, + 0x1D80, 0x031B, // combining horn - 0x1D96, + 0x1DA0, 0x0327, // combining cedilla - 0x1DA2, + 0x1DAC, // leaf dead_key table 0x0000, // number of entries - // offset 0x1C62: + // offset 0x1C6C: // prefix: // Compose // <acute accent> @@ -11617,7 +11627,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1C72: + // offset 0x1C7C: // prefix: // Compose // <acute accent> @@ -11659,7 +11669,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1C92: + // offset 0x1C9C: // prefix: // Compose // <acute accent> @@ -11699,7 +11709,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CB0: + // offset 0x1CBA: // prefix: // Compose // <acute accent> @@ -11721,7 +11731,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CBC: + // offset 0x1CC6: // prefix: // Compose // <acute accent> @@ -11739,7 +11749,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CC4: + // offset 0x1CCE: // prefix: // Compose // <acute accent> @@ -11757,7 +11767,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CCC: + // offset 0x1CD6: // prefix: // Compose // <acute accent> @@ -11783,7 +11793,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CDC: + // offset 0x1CE6: // prefix: // Compose // <acute accent> @@ -11805,7 +11815,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CE8: + // offset 0x1CF2: // prefix: // Compose // <acute accent> @@ -11823,7 +11833,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CF0: + // offset 0x1CFA: // prefix: // Compose // <acute accent> @@ -11845,7 +11855,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1CFC: + // offset 0x1D06: // prefix: // Compose // <acute accent> @@ -11867,7 +11877,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D08: + // offset 0x1D12: // prefix: // Compose // <acute accent> @@ -11885,7 +11895,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D10: + // offset 0x1D1A: // prefix: // Compose // <acute accent> @@ -11911,7 +11921,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D20: + // offset 0x1D2A: // prefix: // Compose // <acute accent> @@ -11933,7 +11943,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D2C: + // offset 0x1D36: // prefix: // Compose // <acute accent> @@ -11955,7 +11965,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D38: + // offset 0x1D42: // prefix: // Compose // <acute accent> @@ -11973,7 +11983,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D40: + // offset 0x1D4A: // prefix: // Compose // <acute accent> @@ -11999,7 +12009,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D50: + // offset 0x1D5A: // prefix: // Compose // <acute accent> @@ -12017,7 +12027,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D58: + // offset 0x1D62: // prefix: // Compose // <acute accent> @@ -12057,7 +12067,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D76: + // offset 0x1D80: // prefix: // Compose // <acute accent> @@ -12099,7 +12109,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1D96: + // offset 0x1DA0: // prefix: // Compose // <acute accent> @@ -12121,7 +12131,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DA2: + // offset 0x1DAC: // prefix: // Compose // <acute accent> @@ -12139,7 +12149,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DAA: + // offset 0x1DB4: // prefix: // Compose // <cedilla> @@ -12196,7 +12206,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DDA: + // offset 0x1DE4: // prefix: // Compose // <breve> @@ -12213,7 +12223,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DE2: + // offset 0x1DEC: // prefix: // Compose // <greek capital letter alpha> @@ -12228,7 +12238,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DE8: + // offset 0x1DF2: // prefix: // Compose // <greek capital letter epsilon> @@ -12243,7 +12253,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DEE: + // offset 0x1DF8: // prefix: // Compose // <greek capital letter eta> @@ -12258,7 +12268,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DF4: + // offset 0x1DFE: // prefix: // Compose // <greek capital letter iota> @@ -12275,7 +12285,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1DFC: + // offset 0x1E06: // prefix: // Compose // <greek capital letter omicron> @@ -12290,7 +12300,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1E02: + // offset 0x1E0C: // prefix: // Compose // <greek capital letter upsilon> @@ -12307,7 +12317,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1E0A: + // offset 0x1E14: // prefix: // Compose // <greek capital letter omega> @@ -12322,7 +12332,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1E10: + // offset 0x1E1A: // prefix: // Compose // <greek small letter alpha> @@ -12337,7 +12347,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1E16: + // offset 0x1E20: // prefix: // Compose // <greek small letter epsilon> @@ -12352,7 +12362,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1E1C: + // offset 0x1E26: // prefix: // Compose // <greek small letter eta> @@ -12367,24 +12377,24 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1E22: + // offset 0x1E2C: // prefix: // Compose // <greek small letter iota> // internal character table 0x0006, // number of entries 0x0027, // apostrophe - 0x1EBE, + 0x1EC8, 0x0028, // left parenthesis - 0x1F28, + 0x1F32, 0x0029, // right parenthesis - 0x1F38, + 0x1F42, 0x0060, // grave accent - 0x1F48, + 0x1F52, 0x007E, // tilde - 0x1FB2, + 0x1FBC, 0x00B4, // acute accent - 0x201C, + 0x2026, // leaf character table 0x0041, // number of entries 0x0022, // quotation mark @@ -12520,19 +12530,19 @@ // internal dead_key table 0x0005, // number of entries 0x0300, // combining grave accent - 0x2086, + 0x2090, 0x0301, // combining acute accent - 0x20F0, + 0x20FA, 0x0303, // combining tilde - 0x215A, + 0x2164, 0x0313, // combining comma above - 0x21C2, + 0x21CC, 0x0314, // combining reversed comma above - 0x21D2, + 0x21DC, // leaf dead_key table 0x0000, // number of entries - // offset 0x1EBE: + // offset 0x1EC8: // prefix: // Compose // <greek small letter iota> @@ -12540,9 +12550,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x1EE8, + 0x1EF2, 0x0029, // right parenthesis - 0x1EF8, + 0x1F02, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -12578,13 +12588,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x1F08, + 0x1F12, 0x0314, // combining reversed comma above - 0x1F18, + 0x1F22, // leaf dead_key table 0x0000, // number of entries - // offset 0x1EE8: + // offset 0x1EF2: // prefix: // Compose // <greek small letter iota> @@ -12611,7 +12621,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1EF8: + // offset 0x1F02: // prefix: // Compose // <greek small letter iota> @@ -12638,7 +12648,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F08: + // offset 0x1F12: // prefix: // Compose // <greek small letter iota> @@ -12665,7 +12675,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F18: + // offset 0x1F22: // prefix: // Compose // <greek small letter iota> @@ -12692,7 +12702,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F28: + // offset 0x1F32: // prefix: // Compose // <greek small letter iota> @@ -12718,7 +12728,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F38: + // offset 0x1F42: // prefix: // Compose // <greek small letter iota> @@ -12744,7 +12754,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F48: + // offset 0x1F52: // prefix: // Compose // <greek small letter iota> @@ -12752,9 +12762,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x1F72, + 0x1F7C, 0x0029, // right parenthesis - 0x1F82, + 0x1F8C, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -12790,13 +12800,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x1F92, + 0x1F9C, 0x0314, // combining reversed comma above - 0x1FA2, + 0x1FAC, // leaf dead_key table 0x0000, // number of entries - // offset 0x1F72: + // offset 0x1F7C: // prefix: // Compose // <greek small letter iota> @@ -12823,7 +12833,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F82: + // offset 0x1F8C: // prefix: // Compose // <greek small letter iota> @@ -12850,7 +12860,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1F92: + // offset 0x1F9C: // prefix: // Compose // <greek small letter iota> @@ -12877,7 +12887,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1FA2: + // offset 0x1FAC: // prefix: // Compose // <greek small letter iota> @@ -12904,7 +12914,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1FB2: + // offset 0x1FBC: // prefix: // Compose // <greek small letter iota> @@ -12912,9 +12922,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x1FDC, + 0x1FE6, 0x0029, // right parenthesis - 0x1FEC, + 0x1FF6, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -12950,13 +12960,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x1FFC, + 0x2006, 0x0314, // combining reversed comma above - 0x200C, + 0x2016, // leaf dead_key table 0x0000, // number of entries - // offset 0x1FDC: + // offset 0x1FE6: // prefix: // Compose // <greek small letter iota> @@ -12983,7 +12993,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1FEC: + // offset 0x1FF6: // prefix: // Compose // <greek small letter iota> @@ -13010,7 +13020,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x1FFC: + // offset 0x2006: // prefix: // Compose // <greek small letter iota> @@ -13037,7 +13047,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x200C: + // offset 0x2016: // prefix: // Compose // <greek small letter iota> @@ -13064,7 +13074,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x201C: + // offset 0x2026: // prefix: // Compose // <greek small letter iota> @@ -13072,9 +13082,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x2046, + 0x2050, 0x0029, // right parenthesis - 0x2056, + 0x2060, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -13110,13 +13120,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x2066, + 0x2070, 0x0314, // combining reversed comma above - 0x2076, + 0x2080, // leaf dead_key table 0x0000, // number of entries - // offset 0x2046: + // offset 0x2050: // prefix: // Compose // <greek small letter iota> @@ -13143,7 +13153,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2056: + // offset 0x2060: // prefix: // Compose // <greek small letter iota> @@ -13170,7 +13180,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2066: + // offset 0x2070: // prefix: // Compose // <greek small letter iota> @@ -13197,7 +13207,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2076: + // offset 0x2080: // prefix: // Compose // <greek small letter iota> @@ -13224,7 +13234,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2086: + // offset 0x2090: // prefix: // Compose // <greek small letter iota> @@ -13232,9 +13242,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x20B0, + 0x20BA, 0x0029, // right parenthesis - 0x20C0, + 0x20CA, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -13270,13 +13280,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x20D0, + 0x20DA, 0x0314, // combining reversed comma above - 0x20E0, + 0x20EA, // leaf dead_key table 0x0000, // number of entries - // offset 0x20B0: + // offset 0x20BA: // prefix: // Compose // <greek small letter iota> @@ -13303,7 +13313,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x20C0: + // offset 0x20CA: // prefix: // Compose // <greek small letter iota> @@ -13330,7 +13340,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x20D0: + // offset 0x20DA: // prefix: // Compose // <greek small letter iota> @@ -13357,7 +13367,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x20E0: + // offset 0x20EA: // prefix: // Compose // <greek small letter iota> @@ -13384,7 +13394,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x20F0: + // offset 0x20FA: // prefix: // Compose // <greek small letter iota> @@ -13392,9 +13402,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x211A, + 0x2124, 0x0029, // right parenthesis - 0x212A, + 0x2134, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -13430,13 +13440,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x213A, + 0x2144, 0x0314, // combining reversed comma above - 0x214A, + 0x2154, // leaf dead_key table 0x0000, // number of entries - // offset 0x211A: + // offset 0x2124: // prefix: // Compose // <greek small letter iota> @@ -13463,7 +13473,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x212A: + // offset 0x2134: // prefix: // Compose // <greek small letter iota> @@ -13490,7 +13500,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x213A: + // offset 0x2144: // prefix: // Compose // <greek small letter iota> @@ -13517,7 +13527,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x214A: + // offset 0x2154: // prefix: // Compose // <greek small letter iota> @@ -13544,7 +13554,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x215A: + // offset 0x2164: // prefix: // Compose // <greek small letter iota> @@ -13552,9 +13562,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x2184, + 0x218E, 0x0029, // right parenthesis - 0x2194, + 0x219E, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -13590,13 +13600,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x21A4, + 0x21AE, 0x0314, // combining reversed comma above - 0x21B4, + 0x21BE, // leaf dead_key table 0x0000, // number of entries - // offset 0x2184: + // offset 0x218E: // prefix: // Compose // <greek small letter iota> @@ -13623,7 +13633,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2194: + // offset 0x219E: // prefix: // Compose // <greek small letter iota> @@ -13650,7 +13660,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21A4: + // offset 0x21AE: // prefix: // Compose // <greek small letter iota> @@ -13677,7 +13687,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21B4: + // offset 0x21BE: // prefix: // Compose // <greek small letter iota> @@ -13702,7 +13712,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21C2: + // offset 0x21CC: // prefix: // Compose // <greek small letter iota> @@ -13728,7 +13738,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21D2: + // offset 0x21DC: // prefix: // Compose // <greek small letter iota> @@ -13754,7 +13764,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21E2: + // offset 0x21EC: // prefix: // Compose // <greek small letter omicron> @@ -13769,7 +13779,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21E8: + // offset 0x21F2: // prefix: // Compose // <greek small letter upsilon> @@ -13786,7 +13796,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21F0: + // offset 0x21FA: // prefix: // Compose // <greek small letter omega> @@ -13801,7 +13811,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21F6: + // offset 0x2200: // prefix: // Compose // <cyrillic capital letter ie> @@ -13816,7 +13826,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x21FC: + // offset 0x2206: // prefix: // Compose // <cyrillic capital letter en> @@ -13833,7 +13843,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2204: + // offset 0x220E: // prefix: // Compose // <cyrillic capital letter es> @@ -13848,7 +13858,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x220A: + // offset 0x2214: // prefix: // Compose // <cyrillic small letter pe> @@ -13863,7 +13873,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2210: + // offset 0x221A: // prefix: // Compose // <hebrew point hiriq> @@ -13878,7 +13888,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2216: + // offset 0x2220: // prefix: // Compose // <hebrew point patah> @@ -13895,7 +13905,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x221E: + // offset 0x2228: // prefix: // Compose // <hebrew point qamats> @@ -13910,7 +13920,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2224: + // offset 0x222E: // prefix: // Compose // <hebrew point holam> @@ -13925,7 +13935,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x222A: + // offset 0x2234: // prefix: // Compose // <hebrew point dagesh or mapiq> @@ -13982,7 +13992,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x225A: + // offset 0x2264: // prefix: // Compose // <arabic question mark> @@ -14001,14 +14011,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2264: + // offset 0x226E: // prefix: // Compose // <arabic letter hamza> // internal character table 0x0001, // number of entries 0x05BC, // hebrew point dagesh or mapiq - 0x226E, + 0x2278, // leaf character table 0x0002, // number of entries 0x05E9, // hebrew shin @@ -14020,7 +14030,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x226E: + // offset 0x2278: // prefix: // Compose // <arabic letter hamza> @@ -14036,14 +14046,14 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2274: + // offset 0x227E: // prefix: // Compose // <arabic letter alef with madda above> // internal character table 0x0001, // number of entries 0x05BC, // hebrew point dagesh or mapiq - 0x227E, + 0x2288, // leaf character table 0x0002, // number of entries 0x05E9, // hebrew shin @@ -14055,7 +14065,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x227E: + // offset 0x2288: // prefix: // Compose // <arabic letter alef with madda above> @@ -14071,7 +14081,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2284: + // offset 0x228E: // prefix: // Compose // <arabic maddah above> @@ -14086,7 +14096,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x228A: + // offset 0x2294: // prefix: // Compose // <arabic hamza above> @@ -14111,7 +14121,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x229A: + // offset 0x22A4: // prefix: // Compose // <arabic hamza below> @@ -14126,7 +14136,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22A0: + // offset 0x22AA: // prefix: // Compose // <devanagari sign nukta> @@ -14161,7 +14171,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22BA: + // offset 0x22C4: // prefix: // Compose // <bengali sign nukta> @@ -14180,7 +14190,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22C4: + // offset 0x22CE: // prefix: // Compose // <bengali vowel sign e> @@ -14197,7 +14207,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22CC: + // offset 0x22D6: // prefix: // Compose // <gurmukhi sign nukta> @@ -14222,7 +14232,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22DC: + // offset 0x22E6: // prefix: // Compose // <oriya sign nukta> @@ -14239,7 +14249,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22E4: + // offset 0x22EE: // prefix: // Compose // <oriya vowel sign e> @@ -14258,7 +14268,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22EE: + // offset 0x22F8: // prefix: // Compose // <tamil vowel sign ee> @@ -14273,7 +14283,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22F4: + // offset 0x22FE: // prefix: // Compose // <tamil au length mark> @@ -14288,7 +14298,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x22FA: + // offset 0x2304: // prefix: // Compose // <telugu vowel sign e> @@ -14303,7 +14313,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2300: + // offset 0x230A: // prefix: // Compose // <kannada vowel sign i> @@ -14318,7 +14328,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2306: + // offset 0x2310: // prefix: // Compose // <kannada vowel sign e> @@ -14337,7 +14347,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2310: + // offset 0x231A: // prefix: // Compose // <kannada vowel sign o> @@ -14352,7 +14362,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2316: + // offset 0x2320: // prefix: // Compose // <malayalam vowel sign e> @@ -14369,7 +14379,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x231E: + // offset 0x2328: // prefix: // Compose // <malayalam vowel sign ee> @@ -14384,7 +14394,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2324: + // offset 0x232E: // prefix: // Compose // <sinhala vowel sign kombuva haa aela-pilla> @@ -14399,7 +14409,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x232A: + // offset 0x2334: // prefix: // Compose // <thai character sara uu> @@ -14418,7 +14428,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2334: + // offset 0x233E: // prefix: // Compose // <tibetan vowel sign aa> @@ -14437,7 +14447,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x233E: + // offset 0x2348: // prefix: // Compose // <tibetan subjoined letter ka> @@ -14452,7 +14462,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2344: + // offset 0x234E: // prefix: // Compose // <tibetan subjoined letter ga> @@ -14467,7 +14477,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x234A: + // offset 0x2354: // prefix: // Compose // <tibetan subjoined letter dda> @@ -14482,7 +14492,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2350: + // offset 0x235A: // prefix: // Compose // <tibetan subjoined letter da> @@ -14497,7 +14507,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2356: + // offset 0x2360: // prefix: // Compose // <tibetan subjoined letter ba> @@ -14512,7 +14522,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x235C: + // offset 0x2366: // prefix: // Compose // <tibetan subjoined letter dza> @@ -14527,7 +14537,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2362: + // offset 0x236C: // prefix: // Compose // <tibetan subjoined letter ra> @@ -14542,7 +14552,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2368: + // offset 0x2372: // prefix: // Compose // <tibetan subjoined letter la> @@ -14557,7 +14567,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x236E: + // offset 0x2378: // prefix: // Compose // <tibetan subjoined letter ssa> @@ -14572,7 +14582,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2374: + // offset 0x237E: // prefix: // Compose // <tibetan subjoined letter ha> @@ -14595,7 +14605,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2382: + // offset 0x238C: // prefix: // Compose // <myanmar vowel sign ii> @@ -14610,7 +14620,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2388: + // offset 0x2392: // prefix: // Compose // <hangul choseong kiyeok> @@ -14625,7 +14635,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x238E: + // offset 0x2398: // prefix: // Compose // <hangul choseong nieun> @@ -14646,7 +14656,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x239A: + // offset 0x23A4: // prefix: // Compose // <hangul choseong tikeut> @@ -14663,7 +14673,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x23A2: + // offset 0x23AC: // prefix: // Compose // <hangul choseong rieul> @@ -14684,7 +14694,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x23AE: + // offset 0x23B8: // prefix: // Compose // <hangul choseong mieum> @@ -14701,7 +14711,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x23B6: + // offset 0x23C0: // prefix: // Compose // <hangul choseong pieup> @@ -14746,7 +14756,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x23DA: + // offset 0x23E4: // prefix: // Compose // <hangul choseong ssangpieup> @@ -14761,7 +14771,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x23E0: + // offset 0x23EA: // prefix: // Compose // <hangul choseong sios> @@ -14806,7 +14816,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2404: + // offset 0x240E: // prefix: // Compose // <hangul choseong ssangsios> @@ -14821,7 +14831,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x240A: + // offset 0x2414: // prefix: // Compose // <hangul choseong ieung> @@ -14856,7 +14866,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2424: + // offset 0x242E: // prefix: // Compose // <hangul choseong cieuc> @@ -14873,7 +14883,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x242C: + // offset 0x2436: // prefix: // Compose // <hangul choseong chieuch> @@ -14890,7 +14900,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2434: + // offset 0x243E: // prefix: // Compose // <hangul choseong phieuph> @@ -14907,7 +14917,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x243C: + // offset 0x2446: // prefix: // Compose // <hangul choseong hieuh> @@ -14922,7 +14932,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2442: + // offset 0x244C: // prefix: // Compose // <hangul choseong pieup-sios> @@ -14945,7 +14955,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2450: + // offset 0x245A: // prefix: // Compose // <hangul choseong sios-pieup> @@ -14960,7 +14970,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2456: + // offset 0x2460: // prefix: // Compose // <hangul choseong chitueumsios> @@ -14975,7 +14985,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x245C: + // offset 0x2466: // prefix: // Compose // <hangul choseong ceongchieumsios> @@ -14990,7 +15000,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2462: + // offset 0x246C: // prefix: // Compose // <hangul choseong chitueumcieuc> @@ -15005,7 +15015,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2468: + // offset 0x2472: // prefix: // Compose // <hangul choseong ceongchieumcieuc> @@ -15020,7 +15030,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x246E: + // offset 0x2478: // prefix: // Compose // <hangul jungseong a> @@ -15039,7 +15049,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2478: + // offset 0x2482: // prefix: // Compose // <hangul jungseong ya> @@ -15058,7 +15068,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2482: + // offset 0x248C: // prefix: // Compose // <hangul jungseong eo> @@ -15079,7 +15089,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x248E: + // offset 0x2498: // prefix: // Compose // <hangul jungseong yeo> @@ -15098,7 +15108,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2498: + // offset 0x24A2: // prefix: // Compose // <hangul jungseong o> @@ -15127,7 +15137,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24AC: + // offset 0x24B6: // prefix: // Compose // <hangul jungseong wa> @@ -15142,7 +15152,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24B2: + // offset 0x24BC: // prefix: // Compose // <hangul jungseong yo> @@ -15165,7 +15175,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24C0: + // offset 0x24CA: // prefix: // Compose // <hangul jungseong u> @@ -15194,7 +15204,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24D4: + // offset 0x24DE: // prefix: // Compose // <hangul jungseong weo> @@ -15211,7 +15221,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24DC: + // offset 0x24E6: // prefix: // Compose // <hangul jungseong yu> @@ -15238,7 +15248,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24EE: + // offset 0x24F8: // prefix: // Compose // <hangul jungseong eu> @@ -15257,7 +15267,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24F8: + // offset 0x2502: // prefix: // Compose // <hangul jungseong yi> @@ -15272,7 +15282,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x24FE: + // offset 0x2508: // prefix: // Compose // <hangul jungseong i> @@ -15297,7 +15307,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x250E: + // offset 0x2518: // prefix: // Compose // <hangul jungseong araea> @@ -15318,7 +15328,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x251A: + // offset 0x2524: // prefix: // Compose // <hangul jongseong kiyeok> @@ -15339,7 +15349,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2526: + // offset 0x2530: // prefix: // Compose // <hangul jongseong kiyeok-sios> @@ -15354,7 +15364,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x252C: + // offset 0x2536: // prefix: // Compose // <hangul jongseong nieun> @@ -15381,7 +15391,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x253E: + // offset 0x2548: // prefix: // Compose // <hangul jongseong tikeut> @@ -15398,7 +15408,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2546: + // offset 0x2550: // prefix: // Compose // <hangul jongseong rieul> @@ -15451,7 +15461,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2572: + // offset 0x257C: // prefix: // Compose // <hangul jongseong rieul-kiyeok> @@ -15466,7 +15476,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2578: + // offset 0x2582: // prefix: // Compose // <hangul jongseong rieul-mieum> @@ -15483,7 +15493,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2580: + // offset 0x258A: // prefix: // Compose // <hangul jongseong rieul-pieup> @@ -15502,7 +15512,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x258A: + // offset 0x2594: // prefix: // Compose // <hangul jongseong rieul-sios> @@ -15517,7 +15527,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2590: + // offset 0x259A: // prefix: // Compose // <hangul jongseong mieum> @@ -15548,7 +15558,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25A6: + // offset 0x25B0: // prefix: // Compose // <hangul jongseong pieup> @@ -15571,7 +15581,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25B4: + // offset 0x25BE: // prefix: // Compose // <hangul jongseong sios> @@ -15594,7 +15604,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25C2: + // offset 0x25CC: // prefix: // Compose // <hangul jongseong ieung> @@ -15615,7 +15625,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25CE: + // offset 0x25D8: // prefix: // Compose // <hangul jongseong phieuph> @@ -15632,7 +15642,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25D6: + // offset 0x25E0: // prefix: // Compose // <hangul jongseong hieuh> @@ -15653,7 +15663,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25E2: + // offset 0x25EC: // prefix: // Compose // <hangul jongseong rieul-tikeut> @@ -15668,7 +15678,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25E8: + // offset 0x25F2: // prefix: // Compose // <hangul jongseong mieum-sios> @@ -15683,7 +15693,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25EE: + // offset 0x25F8: // prefix: // Compose // <hangul jongseong ieung-kiyeok> @@ -15698,7 +15708,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25F4: + // offset 0x25FE: // prefix: // Compose // <hangul jongseong yesieung> @@ -15715,7 +15725,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x25FC: + // offset 0x2606: // prefix: // Compose // <greek psili> @@ -15742,7 +15752,7 @@ 0x0303, // combining tilde 0x1FCF, // -> psili and perispomeni - // offset 0x260E: + // offset 0x2618: // prefix: // Compose // <greek dasia> @@ -15769,7 +15779,7 @@ 0x0303, // combining tilde 0x1FDF, // -> dasia and perispomeni - // offset 0x2620: + // offset 0x262A: // prefix: // Compose // <there exists> @@ -15784,7 +15794,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2626: + // offset 0x2630: // prefix: // Compose // <element of> @@ -15799,7 +15809,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x262C: + // offset 0x2636: // prefix: // Compose // <contains as member> @@ -15814,7 +15824,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2632: + // offset 0x263C: // prefix: // Compose // <divides> @@ -15829,7 +15839,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2638: + // offset 0x2642: // prefix: // Compose // <parallel to> @@ -15844,7 +15854,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x263E: + // offset 0x2648: // prefix: // Compose // <tilde operator> @@ -15859,7 +15869,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2644: + // offset 0x264E: // prefix: // Compose // <asymptotically equal to> @@ -15874,7 +15884,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x264A: + // offset 0x2654: // prefix: // Compose // <almost equal to> @@ -15889,7 +15899,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2650: + // offset 0x265A: // prefix: // Compose // <equivalent to> @@ -15904,7 +15914,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2656: + // offset 0x2660: // prefix: // Compose // <identical to> @@ -15919,7 +15929,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x265C: + // offset 0x2666: // prefix: // Compose // <less-than or equal to> @@ -15934,7 +15944,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2662: + // offset 0x266C: // prefix: // Compose // <greater-than or equal to> @@ -15949,7 +15959,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2668: + // offset 0x2672: // prefix: // Compose // <less-than or equivalent to> @@ -15964,7 +15974,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x266E: + // offset 0x2678: // prefix: // Compose // <greater-than or equivalent to> @@ -15979,7 +15989,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2674: + // offset 0x267E: // prefix: // Compose // <less-than or greater-than> @@ -15994,7 +16004,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x267A: + // offset 0x2684: // prefix: // Compose // <greater-than or less-than> @@ -16009,7 +16019,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2680: + // offset 0x268A: // prefix: // Compose // <precedes> @@ -16024,7 +16034,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2686: + // offset 0x2690: // prefix: // Compose // <succeeds> @@ -16039,7 +16049,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x268C: + // offset 0x2696: // prefix: // Compose // <precedes or equal to> @@ -16054,7 +16064,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2692: + // offset 0x269C: // prefix: // Compose // <succeeds or equal to> @@ -16069,7 +16079,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2698: + // offset 0x26A2: // prefix: // Compose // <subset of> @@ -16084,7 +16094,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x269E: + // offset 0x26A8: // prefix: // Compose // <superset of> @@ -16099,7 +16109,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26A4: + // offset 0x26AE: // prefix: // Compose // <subset of or equal to> @@ -16114,7 +16124,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26AA: + // offset 0x26B4: // prefix: // Compose // <superset of or equal to> @@ -16129,7 +16139,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26B0: + // offset 0x26BA: // prefix: // Compose // <square image of or equal to> @@ -16144,7 +16154,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26B6: + // offset 0x26C0: // prefix: // Compose // <square original of or equal to> @@ -16159,7 +16169,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26BC: + // offset 0x26C6: // prefix: // Compose // <right tack> @@ -16174,7 +16184,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26C2: + // offset 0x26CC: // prefix: // Compose // <true> @@ -16189,7 +16199,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26C8: + // offset 0x26D2: // prefix: // Compose // <forces> @@ -16204,7 +16214,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26CE: + // offset 0x26D8: // prefix: // Compose // <double vertical bar double right turnstile> @@ -16219,7 +16229,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26D4: + // offset 0x26DE: // prefix: // Compose // <normal subgroup of> @@ -16234,7 +16244,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26DA: + // offset 0x26E4: // prefix: // Compose // <contains as normal subgroup> @@ -16249,7 +16259,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26E0: + // offset 0x26EA: // prefix: // Compose // <normal subgroup of or equal to> @@ -16264,7 +16274,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26E6: + // offset 0x26F0: // prefix: // Compose // <contains as normal subgroup or equal to> @@ -16279,7 +16289,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26EC: + // offset 0x26F6: // prefix: // Compose // <nonforking> @@ -16294,7 +16304,169 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x26F2: + // offset 0x26FC: + // prefix: + // Dead<quotation mark> + // internal character table + 0x0000, // number of entries + // leaf character table + 0x000B, // number of entries + 0x0020, // space + 0x0022, // -> quotation mark + 0x0041, // capital a + 0x00C4, // -> capital a with diaeresis + 0x0045, // capital e + 0x00CB, // -> capital e with diaeresis + 0x0049, // capital i + 0x00CF, // -> capital i with diaeresis + 0x004F, // capital o + 0x00D6, // -> capital o with diaeresis + 0x0055, // capital u + 0x00DC, // -> capital u with diaeresis + 0x0061, // letter a + 0x00E4, // -> letter a with diaeresis + 0x0065, // letter e + 0x00EB, // -> letter e with diaeresis + 0x0069, // letter i + 0x00EF, // -> letter i with diaeresis + 0x006F, // letter o + 0x00F6, // -> letter o with diaeresis + 0x0075, // letter u + 0x00FC, // -> letter u with diaeresis + // internal dead_key table + 0x0000, // number of entries + // leaf dead_key table + 0x0000, // number of entries + + // offset 0x2716: + // prefix: + // Dead<apostrophe> + // internal character table + 0x0000, // number of entries + // leaf character table + 0x000F, // number of entries + 0x0020, // space + 0x0027, // -> apostrophe + 0x0041, // capital a + 0x00C1, // -> capital a with acute + 0x0043, // capital c + 0x00C7, // -> capital c with cedilla + 0x0045, // capital e + 0x00C9, // -> capital e with acute + 0x0049, // capital i + 0x00CD, // -> capital i with acute + 0x004F, // capital o + 0x00D3, // -> capital o with acute + 0x0055, // capital u + 0x00DA, // -> capital u with acute + 0x0059, // capital y + 0x00DD, // -> capital y with acute + 0x0061, // letter a + 0x00E1, // -> letter a with acute + 0x0063, // letter c + 0x00E7, // -> letter c with cedilla + 0x0065, // letter e + 0x00E9, // -> letter e with acute + 0x0069, // letter i + 0x00ED, // -> letter i with acute + 0x006F, // letter o + 0x00F3, // -> letter o with acute + 0x0075, // letter u + 0x00FA, // -> letter u with acute + 0x0079, // letter y + 0x00FD, // -> letter y with acute + // internal dead_key table + 0x0000, // number of entries + // leaf dead_key table + 0x0000, // number of entries + + // offset 0x2738: + // prefix: + // Dead<circumflex accent> + // internal character table + 0x0000, // number of entries + // leaf character table + 0x000B, // number of entries + 0x0020, // space + 0x005E, // -> circumflex accent + 0x0041, // capital a + 0x00C2, // -> capital a with circumflex + 0x0045, // capital e + 0x00CA, // -> capital e with circumflex + 0x0049, // capital i + 0x00CE, // -> capital i with circumflex + 0x004F, // capital o + 0x00D4, // -> capital o with circumflex + 0x0055, // capital u + 0x00DB, // -> capital u with circumflex + 0x0061, // letter a + 0x00E2, // -> letter a with circumflex + 0x0065, // letter e + 0x00EA, // -> letter e with circumflex + 0x0069, // letter i + 0x00EE, // -> letter i with circumflex + 0x006F, // letter o + 0x00F4, // -> letter o with circumflex + 0x0075, // letter u + 0x00FB, // -> letter u with circumflex + // internal dead_key table + 0x0000, // number of entries + // leaf dead_key table + 0x0000, // number of entries + + // offset 0x2752: + // prefix: + // Dead<grave accent> + // internal character table + 0x0000, // number of entries + // leaf character table + 0x0009, // number of entries + 0x0020, // space + 0x0060, // -> grave accent + 0x0045, // capital e + 0x00C8, // -> capital e with grave + 0x0049, // capital i + 0x00CC, // -> capital i with grave + 0x004F, // capital o + 0x00D2, // -> capital o with grave + 0x0055, // capital u + 0x00D9, // -> capital u with grave + 0x0065, // letter e + 0x00E8, // -> letter e with grave + 0x0069, // letter i + 0x00EC, // -> letter i with grave + 0x006F, // letter o + 0x00F2, // -> letter o with grave + 0x0075, // letter u + 0x00F9, // -> letter u with grave + // internal dead_key table + 0x0000, // number of entries + // leaf dead_key table + 0x0000, // number of entries + + // offset 0x2768: + // prefix: + // Dead<tilde> + // internal character table + 0x0000, // number of entries + // leaf character table + 0x0005, // number of entries + 0x0020, // space + 0x007E, // -> tilde + 0x004E, // capital n + 0x00D1, // -> capital n with tilde + 0x004F, // capital o + 0x00D5, // -> capital o with tilde + 0x006E, // letter n + 0x00F1, // -> letter n with tilde + 0x006F, // letter o + 0x00F5, // -> letter o with tilde + // internal dead_key table + 0x0000, // number of entries + // leaf dead_key table + 0x0000, // number of entries + + // offset 0x2776: // prefix: // Dead<combining grave accent> // internal character table @@ -16474,50 +16646,50 @@ // internal dead_key table 0x0008, // number of entries 0x0000, // U+0000 - 0x27B2, + 0x2836, 0x0302, // combining circumflex accent - 0x2856, + 0x28DA, 0x0304, // combining macron - 0x2866, + 0x28EA, 0x0306, // combining breve - 0x2872, + 0x28F6, 0x0308, // combining diaeresis - 0x287A, + 0x28FE, 0x0313, // combining comma above - 0x2886, + 0x290A, 0x0314, // combining reversed comma above - 0x28A4, + 0x2928, 0x031B, // combining horn - 0x28C4, + 0x2948, // leaf dead_key table 0x0001, // number of entries 0x0300, // combining grave accent 0x0060, // -> grave accent - // offset 0x27B2: + // offset 0x2836: // prefix: // Dead<combining grave accent> // Compose // internal character table 0x0009, // number of entries 0x0022, // quotation mark - 0x27C8, + 0x284C, 0x0028, // left parenthesis - 0x27D4, + 0x2858, 0x0029, // right parenthesis - 0x27F4, + 0x2878, 0x002B, // plus sign - 0x2812, + 0x2896, 0x0055, // capital u - 0x281E, + 0x28A2, 0x005E, // circumflex accent - 0x2826, + 0x28AA, 0x005F, // low line - 0x2836, + 0x28BA, 0x0062, // letter b - 0x2842, + 0x28C6, 0x00AF, // macron - 0x284A, + 0x28CE, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -16525,7 +16697,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x27C8: + // offset 0x284C: // prefix: // Dead<combining grave accent> // Compose @@ -16547,7 +16719,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x27D4: + // offset 0x2858: // prefix: // Dead<combining grave accent> // Compose @@ -16589,7 +16761,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x27F4: + // offset 0x2878: // prefix: // Dead<combining grave accent> // Compose @@ -16629,7 +16801,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2812: + // offset 0x2896: // prefix: // Dead<combining grave accent> // Compose @@ -16651,7 +16823,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x281E: + // offset 0x28A2: // prefix: // Dead<combining grave accent> // Compose @@ -16669,7 +16841,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2826: + // offset 0x28AA: // prefix: // Dead<combining grave accent> // Compose @@ -16695,7 +16867,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2836: + // offset 0x28BA: // prefix: // Dead<combining grave accent> // Compose @@ -16717,7 +16889,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2842: + // offset 0x28C6: // prefix: // Dead<combining grave accent> // Compose @@ -16735,7 +16907,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x284A: + // offset 0x28CE: // prefix: // Dead<combining grave accent> // Compose @@ -16757,7 +16929,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2856: + // offset 0x28DA: // prefix: // Dead<combining grave accent> // Dead<combining circumflex accent> @@ -16782,7 +16954,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2866: + // offset 0x28EA: // prefix: // Dead<combining grave accent> // Dead<combining macron> @@ -16803,7 +16975,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2872: + // offset 0x28F6: // prefix: // Dead<combining grave accent> // Dead<combining breve> @@ -16820,7 +16992,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x287A: + // offset 0x28FE: // prefix: // Dead<combining grave accent> // Dead<combining diaeresis> @@ -16841,7 +17013,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2886: + // offset 0x290A: // prefix: // Dead<combining grave accent> // Dead<combining comma above> @@ -16880,7 +17052,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x28A4: + // offset 0x2928: // prefix: // Dead<combining grave accent> // Dead<combining reversed comma above> @@ -16921,7 +17093,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x28C4: + // offset 0x2948: // prefix: // Dead<combining grave accent> // Dead<combining horn> @@ -16942,7 +17114,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x28D0: + // offset 0x2954: // prefix: // Dead<combining acute accent> // internal character table @@ -17184,70 +17356,70 @@ // internal dead_key table 0x000D, // number of entries 0x0000, // U+0000 - 0x29D8, + 0x2A5C, 0x0302, // combining circumflex accent - 0x2AB6, + 0x2B3A, 0x0303, // combining tilde - 0x2AC6, + 0x2B4A, 0x0304, // combining macron - 0x2AD2, + 0x2B56, 0x0306, // combining breve - 0x2ADE, + 0x2B62, 0x0307, // combining dot above - 0x2AE6, + 0x2B6A, 0x0308, // combining diaeresis - 0x2AEE, + 0x2B72, 0x030A, // combining ring above - 0x2B00, + 0x2B84, 0x0313, // combining comma above - 0x2B08, + 0x2B8C, 0x0314, // combining reversed comma above - 0x2B26, + 0x2BAA, 0x031B, // combining horn - 0x2B46, + 0x2BCA, 0x0327, // combining cedilla - 0x2B52, + 0x2BD6, 0x0338, // combining long solidus overlay - 0x2B5A, + 0x2BDE, // leaf dead_key table 0x0001, // number of entries 0x0301, // combining acute accent 0x00B4, // -> acute accent - // offset 0x29D8: + // offset 0x2A5C: // prefix: // Dead<combining acute accent> // Compose // internal character table 0x000E, // number of entries 0x0022, // quotation mark - 0x29F8, + 0x2A7C, 0x0028, // left parenthesis - 0x2A08, + 0x2A8C, 0x0029, // right parenthesis - 0x2A28, + 0x2AAC, 0x002B, // plus sign - 0x2A46, + 0x2ACA, 0x002C, // comma - 0x2A52, + 0x2AD6, 0x002F, // solidus - 0x2A5A, + 0x2ADE, 0x0055, // capital u - 0x2A62, + 0x2AE6, 0x005E, // circumflex accent - 0x2A6A, + 0x2AEE, 0x005F, // low line - 0x2A7A, + 0x2AFE, 0x0062, // letter b - 0x2A86, + 0x2B0A, 0x006F, // letter o - 0x2A8E, + 0x2B12, 0x007E, // tilde - 0x2A96, + 0x2B1A, 0x00AF, // macron - 0x2AA2, + 0x2B26, 0x00B8, // cedilla - 0x2AAE, + 0x2B32, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -17255,7 +17427,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x29F8: + // offset 0x2A7C: // prefix: // Dead<combining acute accent> // Compose @@ -17281,7 +17453,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A08: + // offset 0x2A8C: // prefix: // Dead<combining acute accent> // Compose @@ -17323,7 +17495,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A28: + // offset 0x2AAC: // prefix: // Dead<combining acute accent> // Compose @@ -17363,7 +17535,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A46: + // offset 0x2ACA: // prefix: // Dead<combining acute accent> // Compose @@ -17385,7 +17557,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A52: + // offset 0x2AD6: // prefix: // Dead<combining acute accent> // Compose @@ -17403,7 +17575,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A5A: + // offset 0x2ADE: // prefix: // Dead<combining acute accent> // Compose @@ -17421,7 +17593,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A62: + // offset 0x2AE6: // prefix: // Dead<combining acute accent> // Compose @@ -17439,7 +17611,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A6A: + // offset 0x2AEE: // prefix: // Dead<combining acute accent> // Compose @@ -17465,7 +17637,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A7A: + // offset 0x2AFE: // prefix: // Dead<combining acute accent> // Compose @@ -17487,7 +17659,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A86: + // offset 0x2B0A: // prefix: // Dead<combining acute accent> // Compose @@ -17505,7 +17677,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A8E: + // offset 0x2B12: // prefix: // Dead<combining acute accent> // Compose @@ -17523,7 +17695,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2A96: + // offset 0x2B1A: // prefix: // Dead<combining acute accent> // Compose @@ -17545,7 +17717,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AA2: + // offset 0x2B26: // prefix: // Dead<combining acute accent> // Compose @@ -17567,7 +17739,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AAE: + // offset 0x2B32: // prefix: // Dead<combining acute accent> // Compose @@ -17585,7 +17757,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AB6: + // offset 0x2B3A: // prefix: // Dead<combining acute accent> // Dead<combining circumflex accent> @@ -17610,7 +17782,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AC6: + // offset 0x2B4A: // prefix: // Dead<combining acute accent> // Dead<combining tilde> @@ -17631,7 +17803,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AD2: + // offset 0x2B56: // prefix: // Dead<combining acute accent> // Dead<combining macron> @@ -17652,7 +17824,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2ADE: + // offset 0x2B62: // prefix: // Dead<combining acute accent> // Dead<combining breve> @@ -17669,7 +17841,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AE6: + // offset 0x2B6A: // prefix: // Dead<combining acute accent> // Dead<combining dot above> @@ -17686,7 +17858,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2AEE: + // offset 0x2B72: // prefix: // Dead<combining acute accent> // Dead<combining diaeresis> @@ -17713,7 +17885,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B00: + // offset 0x2B84: // prefix: // Dead<combining acute accent> // Dead<combining ring above> @@ -17730,7 +17902,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B08: + // offset 0x2B8C: // prefix: // Dead<combining acute accent> // Dead<combining comma above> @@ -17769,7 +17941,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B26: + // offset 0x2BAA: // prefix: // Dead<combining acute accent> // Dead<combining reversed comma above> @@ -17810,7 +17982,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B46: + // offset 0x2BCA: // prefix: // Dead<combining acute accent> // Dead<combining horn> @@ -17831,7 +18003,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B52: + // offset 0x2BD6: // prefix: // Dead<combining acute accent> // Dead<combining cedilla> @@ -17848,7 +18020,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B5A: + // offset 0x2BDE: // prefix: // Dead<combining acute accent> // Dead<combining long solidus overlay> @@ -17865,7 +18037,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2B62: + // offset 0x2BE6: // prefix: // Dead<combining circumflex accent> // internal character table @@ -18035,40 +18207,40 @@ // internal dead_key table 0x0006, // number of entries 0x0000, // U+0000 - 0x2C14, + 0x2C98, 0x0300, // combining grave accent - 0x2C7C, + 0x2D00, 0x0301, // combining acute accent - 0x2C8C, + 0x2D10, 0x0303, // combining tilde - 0x2C9C, + 0x2D20, 0x0309, // combining hook above - 0x2CAC, + 0x2D30, 0x0323, // combining dot below - 0x2CBC, + 0x2D40, // leaf dead_key table 0x0001, // number of entries 0x0302, // combining circumflex accent 0x005E, // -> circumflex accent - // offset 0x2C14: + // offset 0x2C98: // prefix: // Dead<combining circumflex accent> // Compose // internal character table 0x0006, // number of entries 0x0021, // exclamation mark - 0x2C24, + 0x2CA8, 0x0053, // capital s - 0x2C34, + 0x2CB8, 0x0054, // capital t - 0x2C3C, + 0x2CC0, 0x005F, // low line - 0x2C44, + 0x2CC8, 0x0073, // letter s - 0x2C6C, + 0x2CF0, 0x0074, // letter t - 0x2C74, + 0x2CF8, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -18076,7 +18248,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C24: + // offset 0x2CA8: // prefix: // Dead<combining circumflex accent> // Compose @@ -18102,7 +18274,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C34: + // offset 0x2CB8: // prefix: // Dead<combining circumflex accent> // Compose @@ -18120,7 +18292,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C3C: + // offset 0x2CC0: // prefix: // Dead<combining circumflex accent> // Compose @@ -18138,7 +18310,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C44: + // offset 0x2CC8: // prefix: // Dead<combining circumflex accent> // Compose @@ -18188,7 +18360,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C6C: + // offset 0x2CF0: // prefix: // Dead<combining circumflex accent> // Compose @@ -18206,7 +18378,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C74: + // offset 0x2CF8: // prefix: // Dead<combining circumflex accent> // Compose @@ -18224,7 +18396,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C7C: + // offset 0x2D00: // prefix: // Dead<combining circumflex accent> // Dead<combining grave accent> @@ -18249,7 +18421,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C8C: + // offset 0x2D10: // prefix: // Dead<combining circumflex accent> // Dead<combining acute accent> @@ -18274,7 +18446,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2C9C: + // offset 0x2D20: // prefix: // Dead<combining circumflex accent> // Dead<combining tilde> @@ -18299,7 +18471,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2CAC: + // offset 0x2D30: // prefix: // Dead<combining circumflex accent> // Dead<combining hook above> @@ -18324,7 +18496,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2CBC: + // offset 0x2D40: // prefix: // Dead<combining circumflex accent> // Dead<combining dot below> @@ -18349,7 +18521,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2CCC: + // offset 0x2D50: // prefix: // Dead<combining tilde> // internal character table @@ -18493,48 +18665,48 @@ // internal dead_key table 0x0009, // number of entries 0x0000, // U+0000 - 0x2D6A, + 0x2DEE, 0x0301, // combining acute accent - 0x2DDE, + 0x2E62, 0x0302, // combining circumflex accent - 0x2DEA, + 0x2E6E, 0x0304, // combining macron - 0x2DFA, + 0x2E7E, 0x0306, // combining breve - 0x2E02, + 0x2E86, 0x0308, // combining diaeresis - 0x2E0A, + 0x2E8E, 0x0313, // combining comma above - 0x2E16, + 0x2E9A, 0x0314, // combining reversed comma above - 0x2E2C, + 0x2EB0, 0x031B, // combining horn - 0x2E44, + 0x2EC8, // leaf dead_key table 0x0001, // number of entries 0x0303, // combining tilde 0x007E, // -> tilde - // offset 0x2D6A: + // offset 0x2DEE: // prefix: // Dead<combining tilde> // Compose // internal character table 0x0007, // number of entries 0x0022, // quotation mark - 0x2D7C, + 0x2E00, 0x0028, // left parenthesis - 0x2D84, + 0x2E08, 0x0029, // right parenthesis - 0x2D9C, + 0x2E20, 0x002B, // plus sign - 0x2DB2, + 0x2E36, 0x0055, // capital u - 0x2DBE, + 0x2E42, 0x005E, // circumflex accent - 0x2DC6, + 0x2E4A, 0x0062, // letter b - 0x2DD6, + 0x2E5A, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -18542,7 +18714,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2D7C: + // offset 0x2E00: // prefix: // Dead<combining tilde> // Compose @@ -18560,7 +18732,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2D84: + // offset 0x2E08: // prefix: // Dead<combining tilde> // Compose @@ -18594,7 +18766,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2D9C: + // offset 0x2E20: // prefix: // Dead<combining tilde> // Compose @@ -18626,7 +18798,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DB2: + // offset 0x2E36: // prefix: // Dead<combining tilde> // Compose @@ -18648,7 +18820,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DBE: + // offset 0x2E42: // prefix: // Dead<combining tilde> // Compose @@ -18666,7 +18838,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DC6: + // offset 0x2E4A: // prefix: // Dead<combining tilde> // Compose @@ -18692,7 +18864,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DD6: + // offset 0x2E5A: // prefix: // Dead<combining tilde> // Compose @@ -18710,7 +18882,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DDE: + // offset 0x2E62: // prefix: // Dead<combining tilde> // Dead<combining acute accent> @@ -18731,7 +18903,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DEA: + // offset 0x2E6E: // prefix: // Dead<combining tilde> // Dead<combining circumflex accent> @@ -18756,7 +18928,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2DFA: + // offset 0x2E7E: // prefix: // Dead<combining tilde> // Dead<combining macron> @@ -18773,7 +18945,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2E02: + // offset 0x2E86: // prefix: // Dead<combining tilde> // Dead<combining breve> @@ -18790,7 +18962,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2E0A: + // offset 0x2E8E: // prefix: // Dead<combining tilde> // Dead<combining diaeresis> @@ -18811,7 +18983,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2E16: + // offset 0x2E9A: // prefix: // Dead<combining tilde> // Dead<combining comma above> @@ -18842,7 +19014,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2E2C: + // offset 0x2EB0: // prefix: // Dead<combining tilde> // Dead<combining reversed comma above> @@ -18875,7 +19047,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2E44: + // offset 0x2EC8: // prefix: // Dead<combining tilde> // Dead<combining horn> @@ -18896,7 +19068,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2E50: + // offset 0x2ED4: // prefix: // Dead<combining macron> // internal character table @@ -19018,42 +19190,42 @@ // internal dead_key table 0x0008, // number of entries 0x0000, // U+0000 - 0x2ED6, + 0x2F5A, 0x0300, // combining grave accent - 0x2F1C, + 0x2FA0, 0x0301, // combining acute accent - 0x2F28, + 0x2FAC, 0x0303, // combining tilde - 0x2F34, + 0x2FB8, 0x0307, // combining dot above - 0x2F3C, + 0x2FC0, 0x0308, // combining diaeresis - 0x2F48, + 0x2FCC, 0x0323, // combining dot below - 0x2F58, + 0x2FDC, 0x0328, // combining ogonek - 0x2F64, + 0x2FE8, // leaf dead_key table 0x0001, // number of entries 0x0304, // combining macron 0x00AF, // -> macron - // offset 0x2ED6: + // offset 0x2F5A: // prefix: // Dead<combining macron> // Compose // internal character table 0x0005, // number of entries 0x0021, // exclamation mark - 0x2EE4, + 0x2F68, 0x0022, // quotation mark - 0x2EF0, + 0x2F74, 0x002E, // full stop - 0x2F00, + 0x2F84, 0x003B, // semicolon - 0x2F0C, + 0x2F90, 0x007E, // tilde - 0x2F14, + 0x2F98, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -19061,7 +19233,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2EE4: + // offset 0x2F68: // prefix: // Dead<combining macron> // Compose @@ -19083,7 +19255,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2EF0: + // offset 0x2F74: // prefix: // Dead<combining macron> // Compose @@ -19109,7 +19281,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F00: + // offset 0x2F84: // prefix: // Dead<combining macron> // Compose @@ -19131,7 +19303,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F0C: + // offset 0x2F90: // prefix: // Dead<combining macron> // Compose @@ -19149,7 +19321,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F14: + // offset 0x2F98: // prefix: // Dead<combining macron> // Compose @@ -19167,7 +19339,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F1C: + // offset 0x2FA0: // prefix: // Dead<combining macron> // Dead<combining grave accent> @@ -19188,7 +19360,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F28: + // offset 0x2FAC: // prefix: // Dead<combining macron> // Dead<combining acute accent> @@ -19209,7 +19381,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F34: + // offset 0x2FB8: // prefix: // Dead<combining macron> // Dead<combining tilde> @@ -19226,7 +19398,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F3C: + // offset 0x2FC0: // prefix: // Dead<combining macron> // Dead<combining dot above> @@ -19247,7 +19419,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F48: + // offset 0x2FCC: // prefix: // Dead<combining macron> // Dead<combining diaeresis> @@ -19272,7 +19444,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F58: + // offset 0x2FDC: // prefix: // Dead<combining macron> // Dead<combining dot below> @@ -19293,7 +19465,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F64: + // offset 0x2FE8: // prefix: // Dead<combining macron> // Dead<combining ogonek> @@ -19310,7 +19482,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2F6C: + // offset 0x2FF0: // prefix: // Dead<combining breve> // internal character table @@ -19400,36 +19572,36 @@ // internal dead_key table 0x0007, // number of entries 0x0000, // U+0000 - 0x2FD0, + 0x3054, 0x0300, // combining grave accent - 0x2FF2, + 0x3076, 0x0301, // combining acute accent - 0x2FFA, + 0x307E, 0x0303, // combining tilde - 0x3002, + 0x3086, 0x0309, // combining hook above - 0x300A, + 0x308E, 0x0323, // combining dot below - 0x3012, + 0x3096, 0x0327, // combining cedilla - 0x301A, + 0x309E, // leaf dead_key table 0x0001, // number of entries 0x0306, // combining breve 0x02D8, // -> breve - // offset 0x2FD0: + // offset 0x3054: // prefix: // Dead<combining breve> // Compose // internal character table 0x0003, // number of entries 0x0021, // exclamation mark - 0x2FDA, + 0x305E, 0x002C, // comma - 0x2FE2, + 0x3066, 0x00B8, // cedilla - 0x2FEA, + 0x306E, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -19437,7 +19609,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2FDA: + // offset 0x305E: // prefix: // Dead<combining breve> // Compose @@ -19455,7 +19627,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2FE2: + // offset 0x3066: // prefix: // Dead<combining breve> // Compose @@ -19473,7 +19645,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2FEA: + // offset 0x306E: // prefix: // Dead<combining breve> // Compose @@ -19491,7 +19663,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2FF2: + // offset 0x3076: // prefix: // Dead<combining breve> // Dead<combining grave accent> @@ -19508,7 +19680,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x2FFA: + // offset 0x307E: // prefix: // Dead<combining breve> // Dead<combining acute accent> @@ -19525,7 +19697,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3002: + // offset 0x3086: // prefix: // Dead<combining breve> // Dead<combining tilde> @@ -19542,7 +19714,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x300A: + // offset 0x308E: // prefix: // Dead<combining breve> // Dead<combining hook above> @@ -19559,7 +19731,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3012: + // offset 0x3096: // prefix: // Dead<combining breve> // Dead<combining dot below> @@ -19576,7 +19748,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x301A: + // offset 0x309E: // prefix: // Dead<combining breve> // Dead<combining cedilla> @@ -19593,7 +19765,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3022: + // offset 0x30A6: // prefix: // Dead<combining dot above> // internal character table @@ -19715,36 +19887,36 @@ // internal dead_key table 0x0006, // number of entries 0x0000, // U+0000 - 0x30A4, + 0x3128, 0x0301, // combining acute accent - 0x30D0, + 0x3154, 0x0304, // combining macron - 0x30D8, + 0x315C, 0x030C, // combining caron - 0x30E4, + 0x3168, 0x0323, // combining dot below - 0x30EC, + 0x3170, 0x0338, // combining long solidus overlay - 0x30F4, + 0x3178, // leaf dead_key table 0x0001, // number of entries 0x0307, // combining dot above 0x02D9, // -> dot above - // offset 0x30A4: + // offset 0x3128: // prefix: // Dead<combining dot above> // Compose // internal character table 0x0004, // number of entries 0x0021, // exclamation mark - 0x30B0, + 0x3134, 0x0027, // apostrophe - 0x30B8, + 0x313C, 0x0063, // letter c - 0x30C0, + 0x3144, 0x00B4, // acute accent - 0x30C8, + 0x314C, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -19752,7 +19924,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30B0: + // offset 0x3134: // prefix: // Dead<combining dot above> // Compose @@ -19770,7 +19942,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30B8: + // offset 0x313C: // prefix: // Dead<combining dot above> // Compose @@ -19788,7 +19960,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30C0: + // offset 0x3144: // prefix: // Dead<combining dot above> // Compose @@ -19806,7 +19978,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30C8: + // offset 0x314C: // prefix: // Dead<combining dot above> // Compose @@ -19824,7 +19996,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30D0: + // offset 0x3154: // prefix: // Dead<combining dot above> // Dead<combining acute accent> @@ -19841,7 +20013,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30D8: + // offset 0x315C: // prefix: // Dead<combining dot above> // Dead<combining macron> @@ -19862,7 +20034,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30E4: + // offset 0x3168: // prefix: // Dead<combining dot above> // Dead<combining caron> @@ -19879,7 +20051,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30EC: + // offset 0x3170: // prefix: // Dead<combining dot above> // Dead<combining dot below> @@ -19896,7 +20068,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30F4: + // offset 0x3178: // prefix: // Dead<combining dot above> // Dead<combining long solidus overlay> @@ -19911,7 +20083,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x30FA: + // offset 0x317E: // prefix: // Dead<combining diaeresis> // internal character table @@ -20059,34 +20231,34 @@ // internal dead_key table 0x0006, // number of entries 0x0000, // U+0000 - 0x3196, + 0x321A, 0x0300, // combining grave accent - 0x31B8, + 0x323C, 0x0301, // combining acute accent - 0x31C0, + 0x3244, 0x0303, // combining tilde - 0x31D2, + 0x3256, 0x0304, // combining macron - 0x31DA, + 0x325E, 0x030C, // combining caron - 0x31EA, + 0x326E, // leaf dead_key table 0x0001, // number of entries 0x0308, // combining diaeresis 0x00A8, // -> diaeresis - // offset 0x3196: + // offset 0x321A: // prefix: // Dead<combining diaeresis> // Compose // internal character table 0x0003, // number of entries 0x005F, // low line - 0x31A0, + 0x3224, 0x007E, // tilde - 0x31A8, + 0x322C, 0x00AF, // macron - 0x31B0, + 0x3234, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -20094,7 +20266,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31A0: + // offset 0x3224: // prefix: // Dead<combining diaeresis> // Compose @@ -20112,7 +20284,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31A8: + // offset 0x322C: // prefix: // Dead<combining diaeresis> // Compose @@ -20130,7 +20302,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31B0: + // offset 0x3234: // prefix: // Dead<combining diaeresis> // Compose @@ -20148,7 +20320,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31B8: + // offset 0x323C: // prefix: // Dead<combining diaeresis> // Dead<combining grave accent> @@ -20165,7 +20337,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31C0: + // offset 0x3244: // prefix: // Dead<combining diaeresis> // Dead<combining acute accent> @@ -20192,7 +20364,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31D2: + // offset 0x3256: // prefix: // Dead<combining diaeresis> // Dead<combining tilde> @@ -20209,7 +20381,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31DA: + // offset 0x325E: // prefix: // Dead<combining diaeresis> // Dead<combining macron> @@ -20234,7 +20406,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31EA: + // offset 0x326E: // prefix: // Dead<combining diaeresis> // Dead<combining caron> @@ -20251,7 +20423,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x31F2: + // offset 0x3276: // prefix: // Dead<combining hook above> // internal character table @@ -20379,32 +20551,32 @@ // internal dead_key table 0x0004, // number of entries 0x0000, // U+0000 - 0x3276, + 0x32FA, 0x0302, // combining circumflex accent - 0x32AE, + 0x3332, 0x0306, // combining breve - 0x32BE, + 0x3342, 0x031B, // combining horn - 0x32C6, + 0x334A, // leaf dead_key table 0x0001, // number of entries 0x0309, // combining hook above 0x0309, // -> combining hook above - // offset 0x3276: + // offset 0x32FA: // prefix: // Dead<combining hook above> // Compose // internal character table 0x0004, // number of entries 0x002B, // plus sign - 0x3282, + 0x3306, 0x0055, // capital u - 0x328E, + 0x3312, 0x005E, // circumflex accent - 0x3296, + 0x331A, 0x0062, // letter b - 0x32A6, + 0x332A, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -20412,7 +20584,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3282: + // offset 0x3306: // prefix: // Dead<combining hook above> // Compose @@ -20434,7 +20606,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x328E: + // offset 0x3312: // prefix: // Dead<combining hook above> // Compose @@ -20452,7 +20624,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3296: + // offset 0x331A: // prefix: // Dead<combining hook above> // Compose @@ -20478,7 +20650,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x32A6: + // offset 0x332A: // prefix: // Dead<combining hook above> // Compose @@ -20496,7 +20668,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x32AE: + // offset 0x3332: // prefix: // Dead<combining hook above> // Dead<combining circumflex accent> @@ -20521,7 +20693,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x32BE: + // offset 0x3342: // prefix: // Dead<combining hook above> // Dead<combining breve> @@ -20538,7 +20710,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x32C6: + // offset 0x334A: // prefix: // Dead<combining hook above> // Dead<combining horn> @@ -20559,7 +20731,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x32D2: + // offset 0x3356: // prefix: // Dead<combining ring above> // internal character table @@ -20589,13 +20761,13 @@ // internal dead_key table 0x0001, // number of entries 0x0301, // combining acute accent - 0x32EE, + 0x3372, // leaf dead_key table 0x0001, // number of entries 0x030A, // combining ring above 0x00B0, // -> degree sign - // offset 0x32EE: + // offset 0x3372: // prefix: // Dead<combining ring above> // Dead<combining acute accent> @@ -20612,7 +20784,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x32F6: + // offset 0x337A: // prefix: // Dead<combining double acute accent> // internal character table @@ -20642,7 +20814,7 @@ 0x030B, // combining double acute accent 0x02DD, // -> double acute accent - // offset 0x330C: + // offset 0x3390: // prefix: // Dead<combining caron> // internal character table @@ -20766,24 +20938,24 @@ // internal dead_key table 0x0003, // number of entries 0x0000, // U+0000 - 0x338A, + 0x340E, 0x0307, // combining dot above - 0x3398, + 0x341C, 0x0308, // combining diaeresis - 0x33A0, + 0x3424, // leaf dead_key table 0x0001, // number of entries 0x030C, // combining caron 0x02C7, // -> caron - // offset 0x338A: + // offset 0x340E: // prefix: // Dead<combining caron> // Compose // internal character table 0x0001, // number of entries 0x0022, // quotation mark - 0x3390, + 0x3414, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -20791,7 +20963,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3390: + // offset 0x3414: // prefix: // Dead<combining caron> // Compose @@ -20809,7 +20981,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3398: + // offset 0x341C: // prefix: // Dead<combining caron> // Dead<combining dot above> @@ -20826,7 +20998,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x33A0: + // offset 0x3424: // prefix: // Dead<combining caron> // Dead<combining diaeresis> @@ -20843,7 +21015,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x33A8: + // offset 0x342C: // prefix: // Dead<combining double grave accent> // internal character table @@ -20883,7 +21055,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x33C8: + // offset 0x344C: // prefix: // Dead<combining inverted breve> // internal character table @@ -20919,7 +21091,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x33E4: + // offset 0x3468: // prefix: // Dead<combining comma above> // internal character table @@ -20959,7 +21131,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3404: + // offset 0x3488: // prefix: // Dead<combining reversed comma above> // internal character table @@ -21003,7 +21175,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3428: + // offset 0x34AC: // prefix: // Dead<combining horn> // internal character table @@ -21049,21 +21221,21 @@ // internal dead_key table 0x0005, // number of entries 0x0300, // combining grave accent - 0x345C, + 0x34E0, 0x0301, // combining acute accent - 0x3468, + 0x34EC, 0x0303, // combining tilde - 0x3474, + 0x34F8, 0x0309, // combining hook above - 0x3480, + 0x3504, 0x0323, // combining dot below - 0x348C, + 0x3510, // leaf dead_key table 0x0001, // number of entries 0x031B, // combining horn 0x031B, // -> combining horn - // offset 0x345C: + // offset 0x34E0: // prefix: // Dead<combining horn> // Dead<combining grave accent> @@ -21084,7 +21256,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3468: + // offset 0x34EC: // prefix: // Dead<combining horn> // Dead<combining acute accent> @@ -21105,7 +21277,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3474: + // offset 0x34F8: // prefix: // Dead<combining horn> // Dead<combining tilde> @@ -21126,7 +21298,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3480: + // offset 0x3504: // prefix: // Dead<combining horn> // Dead<combining hook above> @@ -21147,7 +21319,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x348C: + // offset 0x3510: // prefix: // Dead<combining horn> // Dead<combining dot below> @@ -21168,7 +21340,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3498: + // offset 0x351C: // prefix: // Dead<combining dot below> // internal character table @@ -21288,30 +21460,30 @@ // internal dead_key table 0x0006, // number of entries 0x0000, // U+0000 - 0x3518, + 0x359C, 0x0302, // combining circumflex accent - 0x352A, + 0x35AE, 0x0304, // combining macron - 0x353A, + 0x35BE, 0x0306, // combining breve - 0x3546, + 0x35CA, 0x0307, // combining dot above - 0x354E, + 0x35D2, 0x031B, // combining horn - 0x3556, + 0x35DA, // leaf dead_key table 0x0001, // number of entries 0x0323, // combining dot below 0x0323, // -> combining dot below - // offset 0x3518: + // offset 0x359C: // prefix: // Dead<combining dot below> // Compose // internal character table 0x0001, // number of entries 0x002B, // plus sign - 0x351E, + 0x35A2, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -21319,7 +21491,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x351E: + // offset 0x35A2: // prefix: // Dead<combining dot below> // Compose @@ -21341,7 +21513,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x352A: + // offset 0x35AE: // prefix: // Dead<combining dot below> // Dead<combining circumflex accent> @@ -21366,7 +21538,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x353A: + // offset 0x35BE: // prefix: // Dead<combining dot below> // Dead<combining macron> @@ -21387,7 +21559,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3546: + // offset 0x35CA: // prefix: // Dead<combining dot below> // Dead<combining breve> @@ -21404,7 +21576,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x354E: + // offset 0x35D2: // prefix: // Dead<combining dot below> // Dead<combining dot above> @@ -21421,7 +21593,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3556: + // offset 0x35DA: // prefix: // Dead<combining dot below> // Dead<combining horn> @@ -21442,7 +21614,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3562: + // offset 0x35E6: // prefix: // Dead<combining cedilla> // internal character table @@ -21510,15 +21682,15 @@ // internal dead_key table 0x0002, // number of entries 0x0301, // combining acute accent - 0x35A6, + 0x362A, 0x0306, // combining breve - 0x35AE, + 0x3632, // leaf dead_key table 0x0001, // number of entries 0x0327, // combining cedilla 0x00B8, // -> cedilla - // offset 0x35A6: + // offset 0x362A: // prefix: // Dead<combining cedilla> // Dead<combining acute accent> @@ -21535,7 +21707,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x35AE: + // offset 0x3632: // prefix: // Dead<combining cedilla> // Dead<combining breve> @@ -21552,7 +21724,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x35B6: + // offset 0x363A: // prefix: // Dead<combining ogonek> // internal character table @@ -21590,13 +21762,13 @@ // internal dead_key table 0x0001, // number of entries 0x0304, // combining macron - 0x35DA, + 0x365E, // leaf dead_key table 0x0001, // number of entries 0x0328, // combining ogonek 0x02DB, // -> ogonek - // offset 0x35DA: + // offset 0x365E: // prefix: // Dead<combining ogonek> // Dead<combining macron> @@ -21613,7 +21785,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x35E2: + // offset 0x3666: // prefix: // Dead<combining long solidus overlay> // internal character table @@ -21715,15 +21887,15 @@ // internal dead_key table 0x0002, // number of entries 0x0301, // combining acute accent - 0x3648, + 0x36CC, 0x0307, // combining dot above - 0x3650, + 0x36D4, // leaf dead_key table 0x0001, // number of entries 0x0338, // combining long solidus overlay 0x002F, // -> solidus - // offset 0x3648: + // offset 0x36CC: // prefix: // Dead<combining long solidus overlay> // Dead<combining acute accent> @@ -21740,7 +21912,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3650: + // offset 0x36D4: // prefix: // Dead<combining long solidus overlay> // Dead<combining dot above> @@ -21755,7 +21927,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3656: + // offset 0x36DA: // prefix: // Dead<combining greek ypogegrammeni> // internal character table @@ -21893,40 +22065,40 @@ // internal dead_key table 0x0006, // number of entries 0x0000, // U+0000 - 0x36E8, + 0x376C, 0x0300, // combining grave accent - 0x38C0, + 0x3944, 0x0301, // combining acute accent - 0x3930, + 0x39B4, 0x0303, // combining tilde - 0x39A0, + 0x3A24, 0x0313, // combining comma above - 0x3A10, + 0x3A94, 0x0314, // combining reversed comma above - 0x3A20, + 0x3AA4, // leaf dead_key table 0x0001, // number of entries 0x0345, // combining greek ypogegrammeni 0x037A, // -> ypogegrammeni - // offset 0x36E8: + // offset 0x376C: // prefix: // Dead<combining greek ypogegrammeni> // Compose // internal character table 0x0006, // number of entries 0x0027, // apostrophe - 0x36F8, + 0x377C, 0x0028, // left parenthesis - 0x3762, + 0x37E6, 0x0029, // right parenthesis - 0x3772, + 0x37F6, 0x0060, // grave accent - 0x3782, + 0x3806, 0x007E, // tilde - 0x37EC, + 0x3870, 0x00B4, // acute accent - 0x3856, + 0x38DA, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -21934,7 +22106,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x36F8: + // offset 0x377C: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -21942,9 +22114,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x3722, + 0x37A6, 0x0029, // right parenthesis - 0x3732, + 0x37B6, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -21980,13 +22152,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x3742, + 0x37C6, 0x0314, // combining reversed comma above - 0x3752, + 0x37D6, // leaf dead_key table 0x0000, // number of entries - // offset 0x3722: + // offset 0x37A6: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22013,7 +22185,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3732: + // offset 0x37B6: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22040,7 +22212,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3742: + // offset 0x37C6: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22067,7 +22239,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3752: + // offset 0x37D6: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22094,7 +22266,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3762: + // offset 0x37E6: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22120,7 +22292,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3772: + // offset 0x37F6: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22146,7 +22318,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3782: + // offset 0x3806: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22154,9 +22326,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x37AC, + 0x3830, 0x0029, // right parenthesis - 0x37BC, + 0x3840, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -22192,13 +22364,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x37CC, + 0x3850, 0x0314, // combining reversed comma above - 0x37DC, + 0x3860, // leaf dead_key table 0x0000, // number of entries - // offset 0x37AC: + // offset 0x3830: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22225,7 +22397,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x37BC: + // offset 0x3840: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22252,7 +22424,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x37CC: + // offset 0x3850: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22279,7 +22451,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x37DC: + // offset 0x3860: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22306,7 +22478,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x37EC: + // offset 0x3870: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22314,9 +22486,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x3816, + 0x389A, 0x0029, // right parenthesis - 0x3826, + 0x38AA, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -22352,13 +22524,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x3836, + 0x38BA, 0x0314, // combining reversed comma above - 0x3846, + 0x38CA, // leaf dead_key table 0x0000, // number of entries - // offset 0x3816: + // offset 0x389A: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22385,7 +22557,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3826: + // offset 0x38AA: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22412,7 +22584,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3836: + // offset 0x38BA: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22439,7 +22611,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3846: + // offset 0x38CA: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22466,7 +22638,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3856: + // offset 0x38DA: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22474,9 +22646,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x3880, + 0x3904, 0x0029, // right parenthesis - 0x3890, + 0x3914, // leaf character table 0x000F, // number of entries 0x03B1, // letter alpha @@ -22512,13 +22684,13 @@ // internal dead_key table 0x0002, // number of entries 0x0313, // combining comma above - 0x38A0, + 0x3924, 0x0314, // combining reversed comma above - 0x38B0, + 0x3934, // leaf dead_key table 0x0000, // number of entries - // offset 0x3880: + // offset 0x3904: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22545,7 +22717,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3890: + // offset 0x3914: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22572,7 +22744,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x38A0: + // offset 0x3924: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22599,7 +22771,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x38B0: + // offset 0x3934: // prefix: // Dead<combining greek ypogegrammeni> // Compose @@ -22626,7 +22798,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x38C0: + // offset 0x3944: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining grave accent> @@ -22667,15 +22839,15 @@ // internal dead_key table 0x0003, // number of entries 0x0000, // U+0000 - 0x38E8, + 0x396C, 0x0313, // combining comma above - 0x3910, + 0x3994, 0x0314, // combining reversed comma above - 0x3920, + 0x39A4, // leaf dead_key table 0x0000, // number of entries - // offset 0x38E8: + // offset 0x396C: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining grave accent> @@ -22683,9 +22855,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x38F0, + 0x3974, 0x0029, // right parenthesis - 0x3900, + 0x3984, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -22693,7 +22865,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x38F0: + // offset 0x3974: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining grave accent> @@ -22720,7 +22892,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3900: + // offset 0x3984: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining grave accent> @@ -22747,7 +22919,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3910: + // offset 0x3994: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining grave accent> @@ -22773,7 +22945,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3920: + // offset 0x39A4: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining grave accent> @@ -22799,7 +22971,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3930: + // offset 0x39B4: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining acute accent> @@ -22840,15 +23012,15 @@ // internal dead_key table 0x0003, // number of entries 0x0000, // U+0000 - 0x3958, + 0x39DC, 0x0313, // combining comma above - 0x3980, + 0x3A04, 0x0314, // combining reversed comma above - 0x3990, + 0x3A14, // leaf dead_key table 0x0000, // number of entries - // offset 0x3958: + // offset 0x39DC: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining acute accent> @@ -22856,9 +23028,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x3960, + 0x39E4, 0x0029, // right parenthesis - 0x3970, + 0x39F4, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -22866,7 +23038,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3960: + // offset 0x39E4: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining acute accent> @@ -22893,7 +23065,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3970: + // offset 0x39F4: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining acute accent> @@ -22920,7 +23092,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3980: + // offset 0x3A04: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining acute accent> @@ -22946,7 +23118,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3990: + // offset 0x3A14: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining acute accent> @@ -22972,7 +23144,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x39A0: + // offset 0x3A24: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining tilde> @@ -23013,15 +23185,15 @@ // internal dead_key table 0x0003, // number of entries 0x0000, // U+0000 - 0x39C8, + 0x3A4C, 0x0313, // combining comma above - 0x39F0, + 0x3A74, 0x0314, // combining reversed comma above - 0x3A00, + 0x3A84, // leaf dead_key table 0x0000, // number of entries - // offset 0x39C8: + // offset 0x3A4C: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining tilde> @@ -23029,9 +23201,9 @@ // internal character table 0x0002, // number of entries 0x0028, // left parenthesis - 0x39D0, + 0x3A54, 0x0029, // right parenthesis - 0x39E0, + 0x3A64, // leaf character table 0x0000, // number of entries // internal dead_key table @@ -23039,7 +23211,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x39D0: + // offset 0x3A54: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining tilde> @@ -23066,7 +23238,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x39E0: + // offset 0x3A64: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining tilde> @@ -23093,7 +23265,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x39F0: + // offset 0x3A74: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining tilde> @@ -23119,7 +23291,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3A00: + // offset 0x3A84: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining tilde> @@ -23145,7 +23317,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3A10: + // offset 0x3A94: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining comma above> @@ -23170,7 +23342,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3A20: + // offset 0x3AA4: // prefix: // Dead<combining greek ypogegrammeni> // Dead<combining reversed comma above> @@ -23195,7 +23367,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3A30: + // offset 0x3AB4: // prefix: // Dead<combining katakana-hiragana voiced sound mark> // internal character table @@ -23303,7 +23475,7 @@ // leaf dead_key table 0x0000, // number of entries - // offset 0x3A94: + // offset 0x3B18: // prefix: // Dead<combining katakana-hiragana semi-voiced sound mark> // internal character table @@ -23338,7 +23510,7 @@ static const ui::TreeComposeChecker::CompositionData kCompositions = { 5, // maximum sequence length - 15020, // tree array entries + 15152, // tree array entries kCompositionsTree };
diff --git a/ui/base/ime/chromeos/character_composer_sequences.txt b/ui/base/ime/chromeos/character_composer_sequences.txt index 4d2709b..e219f5f 100644 --- a/ui/base/ime/chromeos/character_composer_sequences.txt +++ b/ui/base/ime/chromeos/character_composer_sequences.txt
@@ -4946,3 +4946,64 @@ Dead<combining katakana-hiragana semi-voiced sound mark> <katakana letter hu> <katakana letter pu> Dead<combining katakana-hiragana semi-voiced sound mark> <katakana letter he> <katakana letter pe> Dead<combining katakana-hiragana semi-voiced sound mark> <katakana letter ho> <katakana letter po> + +# Windows-style combinations. +# Reference: +# https://support.microsoft.com/en-ca/help/97738/using-us-int-l-keyboard-layout-to-type-accented-characters + +Dead<'> <space> <'> +Dead<'> <A> <latin capital letter a with acute> +Dead<'> <C> <latin capital letter c with cedilla> +Dead<'> <E> <latin capital letter e with acute> +Dead<'> <I> <latin capital letter i with acute> +Dead<'> <O> <latin capital letter o with acute> +Dead<'> <U> <latin capital letter u with acute> +Dead<'> <Y> <latin capital letter y with acute> +Dead<'> <a> <latin small letter a with acute> +Dead<'> <c> <latin small letter c with cedilla> +Dead<'> <e> <latin small letter e with acute> +Dead<'> <i> <latin small letter i with acute> +Dead<'> <o> <latin small letter o with acute> +Dead<'> <u> <latin small letter u with acute> +Dead<'> <y> <latin small letter y with acute> + +Dead<"> <space> <"> +Dead<"> <A> <latin capital letter a with diaeresis> +Dead<"> <E> <latin capital letter e with diaeresis> +Dead<"> <I> <latin capital letter i with diaeresis> +Dead<"> <O> <latin capital letter o with diaeresis> +Dead<"> <U> <latin capital letter u with diaeresis> +Dead<"> <a> <latin small letter a with diaeresis> +Dead<"> <e> <latin small letter e with diaeresis> +Dead<"> <i> <latin small letter i with diaeresis> +Dead<"> <o> <latin small letter o with diaeresis> +Dead<"> <u> <latin small letter u with diaeresis> + +Dead<`> <space> <`> +Dead<`> <E> <latin capital letter e with grave> +Dead<`> <I> <latin capital letter i with grave> +Dead<`> <O> <latin capital letter o with grave> +Dead<`> <U> <latin capital letter u with grave> +Dead<`> <e> <latin small letter e with grave> +Dead<`> <i> <latin small letter i with grave> +Dead<`> <o> <latin small letter o with grave> +Dead<`> <u> <latin small letter u with grave> + +Dead<~> <space> <~> +Dead<~> <N> <latin capital letter n with tilde> +Dead<~> <O> <latin capital letter o with tilde> +Dead<~> <n> <latin small letter n with tilde> +Dead<~> <o> <latin small letter o with tilde> + +Dead<^> <space> <^> +Dead<^> <A> <latin capital letter a with circumflex> +Dead<^> <E> <latin capital letter e with circumflex> +Dead<^> <I> <latin capital letter i with circumflex> +Dead<^> <O> <latin capital letter o with circumflex> +Dead<^> <U> <latin capital letter u with circumflex> +Dead<^> <a> <latin small letter a with circumflex> +Dead<^> <e> <latin small letter e with circumflex> +Dead<^> <i> <latin small letter i with circumflex> +Dead<^> <o> <latin small letter o with circumflex> +Dead<^> <u> <latin small letter u with circumflex> +
diff --git a/ui/base/ime/chromeos/character_composer_unittest.cc b/ui/base/ime/chromeos/character_composer_unittest.cc index e9bef9b..b15abe3 100644 --- a/ui/base/ime/chromeos/character_composer_unittest.cc +++ b/ui/base/ime/chromeos/character_composer_unittest.cc
@@ -166,6 +166,29 @@ ExpectDeadKeyFiltered(kCombiningAcute); ExpectUnicodeKeyComposed(VKEY_E, DomCode::US_E, EF_NONE, 0x03B5, base::string16(1, 0x03AD)); + + // Windows-style sequences. + // LATIN SMALL LETTER A WITH ACUTE + ExpectDeadKeyFiltered('\''); + ExpectUnicodeKeyComposed(VKEY_A, DomCode::US_A, EF_NONE, 'a', + base::string16(1, 0x00E1)); + // LATIN SMALL LETTER C WITH CEDILLA + ExpectDeadKeyFiltered('\''); + ExpectUnicodeKeyComposed(VKEY_C, DomCode::US_C, EF_NONE, 'c', + base::string16(1, 0x00E7)); + // APOSTROPHE + ExpectDeadKeyFiltered('\''); + ExpectUnicodeKeyComposed(VKEY_SPACE, DomCode::SPACE, EF_NONE, ' ', + base::string16(1, '\'')); + // Unmatched composition with printable character. + static constexpr base::char16 kApostropheS[] = {'\'', 's'}; + ExpectDeadKeyFiltered('\''); + ExpectUnicodeKeyComposed(VKEY_S, DomCode::US_S, EF_NONE, 's', + base::string16(kApostropheS, 2)); + // Unmatched composition with dead key. + static constexpr base::char16 kApostropheApostrophe[] = {'\'', '\''}; + ExpectDeadKeyFiltered('\''); + ExpectDeadKeyComposed('\'', base::string16(kApostropheApostrophe, 2)); } TEST_F(CharacterComposerTest, FullyMatchingSequencesAfterMatchingFailure) {
diff --git a/ui/events/blink/web_input_event_traits.cc b/ui/events/blink/web_input_event_traits.cc index a68e299..9eef8284 100644 --- a/ui/events/blink/web_input_event_traits.cc +++ b/ui/events/blink/web_input_event_traits.cc
@@ -179,10 +179,10 @@ bool WebInputEventTraits::ShouldBlockEventStream( const WebInputEvent& event, - bool raf_aligned_touch_enabled) { + bool raf_aligned_touch_enabled, + bool wheel_scroll_latching_enabled) { switch (event.GetType()) { case WebInputEvent::kContextMenu: - case WebInputEvent::kGestureScrollBegin: case WebInputEvent::kGestureScrollEnd: case WebInputEvent::kGestureShowPress: case WebInputEvent::kGestureTapUnconfirmed: @@ -192,6 +192,9 @@ case WebInputEvent::kGesturePinchEnd: return false; + case WebInputEvent::kGestureScrollBegin: + return wheel_scroll_latching_enabled; + // TouchCancel and TouchScrollStarted should always be non-blocking. case WebInputEvent::kTouchCancel: case WebInputEvent::kTouchScrollStarted:
diff --git a/ui/events/blink/web_input_event_traits.h b/ui/events/blink/web_input_event_traits.h index 74434f7..311cd66 100644 --- a/ui/events/blink/web_input_event_traits.h +++ b/ui/events/blink/web_input_event_traits.h
@@ -29,7 +29,8 @@ static size_t GetSize(blink::WebInputEvent::Type type); static WebScopedInputEvent Clone(const blink::WebInputEvent& event); static bool ShouldBlockEventStream(const blink::WebInputEvent& event, - bool raf_aligned_touch_enabled); + bool raf_aligned_touch_enabled, + bool wheel_scroll_latching_enabled); static bool CanCauseScroll(const blink::WebMouseWheelEvent& event);
diff --git a/ui/events/keycodes/keyboard_code_conversion_xkb.cc b/ui/events/keycodes/keyboard_code_conversion_xkb.cc index 0a3a5206..836f782 100644 --- a/ui/events/keycodes/keyboard_code_conversion_xkb.cc +++ b/ui/events/keycodes/keyboard_code_conversion_xkb.cc
@@ -13,6 +13,13 @@ namespace ui { +// We support dead keys beyond those with predefined keysym names, +// expressed as numeric constants with |kDeadKeyFlag| set. +// Xkbcommon accepts and does not use any bits in 0x0E000000. +// +constexpr xkb_keysym_t kDeadKeyFlag = 0x08000000; +constexpr int32_t kUnicodeMax = 0x10FFFF; + DomKey NonPrintableXKeySymToDomKey(xkb_keysym_t keysym) { switch (keysym) { case XKB_KEY_BackSpace: @@ -466,10 +473,15 @@ // greek question mark return DomKey::DeadKeyFromCombiningCharacter(0x037E); default: + if (keysym & kDeadKeyFlag) { + int32_t character = keysym & ~kDeadKeyFlag; + if ((character >= 0) && (character <= kUnicodeMax)) { + return DomKey::DeadKeyFromCombiningCharacter(character); + } + } return DomKey::NONE; } } - DomKey XKeySymToDomKey(xkb_keysym_t keysym, base::char16 character) { DomKey dom_key = NonPrintableXKeySymToDomKey(keysym); if (dom_key != DomKey::NONE)