1313#include " flutter/shell/common/thread_host.h"
1414#include " flutter/testing/fixture_test.h"
1515#include " flutter/testing/testing.h"
16+ #include " fml/mapping.h"
1617#include " gmock/gmock.h"
18+ #include " lib/ui/text/font_collection.h"
1719#include " rapidjson/document.h"
1820#include " rapidjson/stringbuffer.h"
1921#include " rapidjson/writer.h"
22+ #include " runtime/isolate_configuration.h"
23+ #include " shell/common/run_configuration.h"
2024
2125namespace flutter {
2226
@@ -37,6 +41,41 @@ void PostSync(const fml::RefPtr<fml::TaskRunner>& task_runner,
3741 latch.Wait ();
3842}
3943
44+ class FontManifestAssetResolver : public AssetResolver {
45+ public:
46+ FontManifestAssetResolver () {}
47+
48+ bool IsValid () const override { return true ; }
49+
50+ bool IsValidAfterAssetManagerChange () const override { return true ; }
51+
52+ AssetResolver::AssetResolverType GetType () const override {
53+ return AssetResolver::AssetResolverType::kApkAssetProvider ;
54+ }
55+
56+ mutable size_t mapping_call_count = 0u ;
57+ std::unique_ptr<fml::Mapping> GetAsMapping (
58+ const std::string& asset_name) const override {
59+ mapping_call_count++;
60+ if (asset_name == " FontManifest.json" ) {
61+ return std::make_unique<fml::DataMapping>(" [{},{},{}]" );
62+ }
63+ return nullptr ;
64+ }
65+
66+ std::vector<std::unique_ptr<fml::Mapping>> GetAsMappings (
67+ const std::string& asset_pattern,
68+ const std::optional<std::string>& subdir) const override {
69+ return {};
70+ };
71+
72+ bool operator ==(const AssetResolver& other) const override {
73+ auto mapping = GetAsMapping (" FontManifest.json" );
74+ return memcmp (other.GetAsMapping (" FontManifest.json" )->GetMapping (),
75+ mapping->GetMapping (), mapping->GetSize ()) == 0 ;
76+ }
77+ };
78+
4079class MockDelegate : public Engine ::Delegate {
4180 public:
4281 MOCK_METHOD (void ,
@@ -181,6 +220,14 @@ class MockPlatformMessageHandler : public PlatformMessageHandler {
181220 (override ));
182221};
183222
223+ class MockFontCollection : public FontCollection {
224+ public:
225+ MOCK_METHOD (void ,
226+ RegisterFonts,
227+ (const std::shared_ptr<AssetManager>& asset_manager),
228+ (override ));
229+ };
230+
184231std::unique_ptr<PlatformMessage> MakePlatformMessage (
185232 const std::string& channel,
186233 const std::map<std::string, std::string>& values,
@@ -697,6 +744,89 @@ TEST_F(EngineTest, AnimatorSubmitWarmUpImplicitView) {
697744 draw_latch.Wait ();
698745}
699746
747+ TEST_F (EngineTest, SpawnedEngineInheritsAssetManager) {
748+ PostUITaskSync ([this ] {
749+ MockRuntimeDelegate client;
750+ auto mock_runtime_controller =
751+ std::make_unique<MockRuntimeController>(client, task_runners_);
752+ auto vm_ref = DartVMRef::Create (settings_);
753+ EXPECT_CALL (*mock_runtime_controller, GetDartVM ())
754+ .WillRepeatedly (::testing::Return (vm_ref.get ()));
755+
756+ // auto mock_font_collection = std::make_shared<MockFontCollection>();
757+ // EXPECT_CALL(*mock_font_collection, RegisterFonts(::testing::_))
758+ // .WillOnce(::testing::Return());
759+ auto engine = std::make_unique<Engine>(
760+ /* delegate=*/ delegate_,
761+ /* dispatcher_maker=*/ dispatcher_maker_,
762+ /* image_decoder_task_runner=*/ image_decoder_task_runner_,
763+ /* task_runners=*/ task_runners_,
764+ /* settings=*/ settings_,
765+ /* animator=*/ std::move (animator_),
766+ /* io_manager=*/ io_manager_,
767+ /* font_collection=*/ std::make_shared<FontCollection>(),
768+ /* runtime_controller=*/ std::move (mock_runtime_controller),
769+ /* gpu_disabled_switch=*/ std::make_shared<fml::SyncSwitch>());
770+
771+ EXPECT_EQ (engine->GetAssetManager (), nullptr );
772+
773+ auto asset_manager = std::make_shared<AssetManager>();
774+ asset_manager->PushBack (std::make_unique<FontManifestAssetResolver>());
775+ engine->UpdateAssetManager (asset_manager);
776+ EXPECT_EQ (engine->GetAssetManager (), asset_manager);
777+
778+ auto spawn =
779+ engine->Spawn (delegate_, dispatcher_maker_, settings_, nullptr ,
780+ std::string (), io_manager_, snapshot_delegate_, nullptr );
781+ EXPECT_TRUE (spawn != nullptr );
782+ EXPECT_EQ (engine->GetAssetManager (), spawn->GetAssetManager ());
783+ });
784+ }
785+
786+ TEST_F (EngineTest, UpdateAssetManagerWithEqualManagers) {
787+ PostUITaskSync ([this ] {
788+ MockRuntimeDelegate client;
789+ auto mock_runtime_controller =
790+ std::make_unique<MockRuntimeController>(client, task_runners_);
791+ auto vm_ref = DartVMRef::Create (settings_);
792+ EXPECT_CALL (*mock_runtime_controller, GetDartVM ())
793+ .WillRepeatedly (::testing::Return (vm_ref.get ()));
794+
795+ auto mock_font_collection = std::make_shared<MockFontCollection>();
796+ EXPECT_CALL (*mock_font_collection, RegisterFonts (::testing::_))
797+ .WillOnce (::testing::Return ());
798+ auto engine = std::make_unique<Engine>(
799+ /* delegate=*/ delegate_,
800+ /* dispatcher_maker=*/ dispatcher_maker_,
801+ /* image_decoder_task_runner=*/ image_decoder_task_runner_,
802+ /* task_runners=*/ task_runners_,
803+ /* settings=*/ settings_,
804+ /* animator=*/ std::move (animator_),
805+ /* io_manager=*/ io_manager_,
806+ /* font_collection=*/ mock_font_collection,
807+ /* runtime_controller=*/ std::move (mock_runtime_controller),
808+ /* gpu_disabled_switch=*/ std::make_shared<fml::SyncSwitch>());
809+
810+ EXPECT_EQ (engine->GetAssetManager (), nullptr );
811+
812+ auto asset_manager = std::make_shared<AssetManager>();
813+ asset_manager->PushBack (std::make_unique<FontManifestAssetResolver>());
814+
815+ auto asset_manager_2 = std::make_shared<AssetManager>();
816+ asset_manager_2->PushBack (std::make_unique<FontManifestAssetResolver>());
817+
818+ EXPECT_NE (asset_manager, asset_manager_2);
819+ EXPECT_TRUE (*asset_manager == *asset_manager_2);
820+
821+ engine->UpdateAssetManager (asset_manager);
822+ EXPECT_EQ (engine->GetAssetManager (), asset_manager);
823+
824+ engine->UpdateAssetManager (asset_manager_2);
825+ // Didn't change because they're equivalent.
826+ EXPECT_EQ (engine->GetAssetManager (), asset_manager);
827+ });
828+ }
829+
700830// The warm up frame should work if only some of the registered views are
701831// included.
702832//
0 commit comments