diff --git ui/base/resource/resource_bundle.cc ui/base/resource/resource_bundle.cc
index 45dbcdb991f95..1f021598f6c8d 100644
--- ui/base/resource/resource_bundle.cc
+++ ui/base/resource/resource_bundle.cc
@@ -873,6 +873,12 @@ ResourceBundle::ResourceBundle(Delegate* delegate)
     : delegate_(delegate),
       locale_resources_data_lock_(new base::Lock),
       max_scale_factor_(k100Percent) {
+  // With CEF's multi-threaded mode the ResourceBundle may be created on the
+  // main thread and then accessed on the UI thread. Allow the SequenceChecker
+  // to re-bind on the UI thread when CalledOnValidSequence() is called for the
+  // first time.
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+
   mangle_localized_strings_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kMangleLocalizedStrings);
 }
@@ -882,6 +888,11 @@ ResourceBundle::~ResourceBundle() {
   UnloadLocaleResources();
 }
 
+void ResourceBundle::CleanupOnUIThread() {
+  FreeImages();
+  font_cache_.clear();
+}
+
 // static
 void ResourceBundle::InitSharedInstance(Delegate* delegate) {
   DCHECK(g_shared_instance_ == nullptr) << "ResourceBundle initialized twice";
diff --git ui/base/resource/resource_bundle.h ui/base/resource/resource_bundle.h
index 5e53e16ce105d..56ad14da6dc5b 100644
--- ui/base/resource/resource_bundle.h
+++ ui/base/resource/resource_bundle.h
@@ -208,6 +208,11 @@ class COMPONENT_EXPORT(UI_BASE) ResourceBundle {
   ResourceBundle(const ResourceBundle&) = delete;
   ResourceBundle& operator=(const ResourceBundle&) = delete;
 
+  // With CEF's multi-threaded mode the ResourceBundle may be created/destroyed
+  // on the main thread but accessed on the UI thread. Call this method on the
+  // UI thread to clean up resources before destruction.
+  void CleanupOnUIThread();
+
   // Loads a secondary locale data pack using the given file region.
   void LoadSecondaryLocaleDataWithPakFileRegion(
       base::File pak_file,