{"record":{"id":"f51ee8cebc4d53b7","repo":"unoplatform/uno","slug":"mediaplayerpresenterextension-must-be-initialized-f51ee8","errorCode":null,"errorMessage":"MediaPlayerPresenterExtension must be initialized with a MediaPlayer instance","messagePattern":"MediaPlayerPresenterExtension must be initialized with a MediaPlayer instance","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/AddIns/Uno.UI.MediaPlayer.WebAssembly/MediaPlayerPresenterExtension.cs","lineNumber":29,"sourceCode":"using Microsoft.UI.Xaml.Media;\n\n[assembly: ApiExtension(typeof(IMediaPlayerPresenterExtension), typeof(Uno.UI.Media.MediaPlayerPresenterExtension))]\n\nnamespace Uno.UI.Media;\n\npublic class MediaPlayerPresenterExtension : IMediaPlayerPresenterExtension\n{\n\tprivate MediaPlayerPresenter? _owner;\n\tprivate HtmlMediaPlayer _htmlPlayer;\n\n\tpublic uint NaturalVideoHeight => (uint)_htmlPlayer.VideoHeight;\n\tpublic uint NaturalVideoWidth => (uint)_htmlPlayer.VideoWidth;\n\n\tpublic MediaPlayerPresenterExtension(object owner)\n\t{\n\t\tif (owner is not MediaPlayerPresenter presenter)\n\t\t{\n\t\t\tthrow new InvalidOperationException($\"MediaPlayerPresenterExtension must be initialized with a MediaPlayer instance\");\n\t\t}\n\n\t\t_owner = presenter;\n\t\t_owner.Child = _htmlPlayer = new HtmlMediaPlayer();\n\t}\n\n\tpublic void MediaPlayerChanged()\n\t{\n\t\tif (this.Log().IsEnabled(LogLevel.Debug))\n\t\t{\n\t\t\tthis.Log().LogDebug(\"Enter MediaPlayerPresenterExtension.MediaPlayerChanged().\");\n\t\t}\n\t\tif (_owner is not null\n\t\t\t&& MediaPlayerExtension.GetByMediaPlayer(_owner.MediaPlayer) is { } extension)\n\t\t{\n\t\t\textension.HtmlPlayer = _htmlPlayer;\n\t\t}\n\t\telse","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/unoplatform/uno/blob/04183404888ea21b4e5bfa3493e8d5f15e972c3a/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/MediaPlayerPresenterExtension.cs#L11-L47","documentation":"MediaPlayerPresenterExtension (WASM) implements IMediaPlayerPresenterExtension and its constructor requires the owner object passed by the framework to be exactly a MediaPlayerPresenter. Uno's extensibility layer instantiates presenter extensions by passing the host control as `object owner`; if anything other than MediaPlayerPresenter is supplied the cast guard throws InvalidOperationException. This indicates a wiring/registration mistake: the extension was registered for the wrong host type, or a custom presenter fed in a foreign object.","triggerScenarios":"The extension is constructed with an owner that is not MediaPlayerPresenter — typically because of a misconfigured ApiExtension registration, a custom MediaPlayerPresenter subclass whose runtime type trips an `is` pattern edge case, or a manual instantiation that passed the wrong control.","commonSituations":"Forking/extending the media stack with a custom presenter and registering MediaPlayerPresenterExtension against the wrong host; calling `new MediaPlayerPresenterExtension(someControl)` directly in tests; an assembly-load order issue resolving the wrong extension type.","solutions":["Verify the [assembly: ApiExtension(...)] registration points the presenter extension at MediaPlayerPresenter (the framework-supplied owner).","If you instantiated the extension manually, pass a MediaPlayerPresenter instance, not a generic FrameworkElement.","Ensure only one media presenter extension assembly is loaded for the target so the framework resolves the correct type."],"exampleFix":"// before (wrong owner)\nvar ext = new MediaPlayerPresenterExtension(someGrid);\n\n// after\nvar ext = new MediaPlayerPresenterExtension(myMediaPlayerPresenter);","handlingStrategy":"validation","validationCode":"if (owner is not MediaPlayerPresenter) throw new ArgumentException(nameof(owner));\nvar ext = new MediaPlayerPresenterExtension(owner);","typeGuard":"static bool IsValidOwner(object owner) => owner is MediaPlayerPresenter;","tryCatchPattern":null,"preventionTips":["Do not instantiate MediaPlayerPresenterExtension manually; let ApiExtensibility resolve it.","Keep ApiExtension registrations paired with the correct host type.","In tests, construct a real MediaPlayerPresenter before exercising the extension."],"tags":["media","type-guard","extension","misuse"],"backgroundTag":null,"analyzedSha":"04183404888ea21b4e5bfa3493e8d5f15e972c3a","analyzedAt":"2026-08-13T21:08:11.651Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}