{"record":{"id":"ca7832a4d641eb29","repo":"dotnet/maui","slug":"renderer-ca7832","errorCode":null,"errorMessage":"renderer","messagePattern":"renderer","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Compatibility/Core/src/iOS/Renderers/WkWebViewRenderer.cs","lineNumber":704,"sourceCode":"\t\t\t\t{\n\t\t\t\t\tcookieBuilder.Append($\"; HttpOnly\");\n\t\t\t\t}\n\n\t\t\t\tcookieBuilder.Append(\"';\");\n\t\t\t}\n\n\t\t\treturn cookieBuilder.ToString();\n\t\t}\n\n\t\tclass CustomWebViewNavigationDelegate : WKNavigationDelegate\n\t\t{\n\t\t\treadonly WkWebViewRenderer _renderer;\n\t\t\tWebNavigationEvent _lastEvent;\n\n\t\t\tpublic CustomWebViewNavigationDelegate(WkWebViewRenderer renderer)\n\t\t\t{\n\t\t\t\tif (renderer == null)\n\t\t\t\t\tthrow new ArgumentNullException(\"renderer\");\n\t\t\t\t_renderer = renderer;\n\t\t\t}\n\n\t\t\tWebView WebView => _renderer.WebView;\n\t\t\tIWebViewController WebViewController => WebView;\n\n\t\t\t[PortHandler]\n\t\t\tpublic override void DidFailNavigation(WKWebView webView, WKNavigation navigation, NSError error)\n\t\t\t{\n\t\t\t\tvar url = GetCurrentUrl();\n\t\t\t\tWebViewController.SendNavigated(\n\t\t\t\t\tnew WebNavigatedEventArgs(_lastEvent, new UrlWebViewSource { Url = url }, url, WebNavigationResult.Failure)\n\t\t\t\t);\n\n\t\t\t\t_renderer.UpdateCanGoBackForward();\n\t\t\t}\n\n\t\t\t[PortHandler]","sourceCodeStart":686,"sourceCodeEnd":722,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Compatibility/Core/src/iOS/Renderers/WkWebViewRenderer.cs#L686-L722","documentation":"CustomWebViewNavigationDelegate is the WKWebView navigation delegate created per WkWebViewRenderer. It stores the renderer to forward navigation events back to the WebView/IWebViewController (lines 261-262). A null renderer would NPE on every callback, so the constructor rejects null.","triggerScenarios":"Constructing new CustomWebViewNavigationDelegate(null), which only happens inside the renderer code if the owning WkWebViewRenderer is null - generally an internal lifecycle issue rather than a caller mistake.","commonSituations":"Subclassing WkWebViewRenderer and overriding delegate creation while the renderer is partially constructed; custom WebView renderers that mis-wire the delegate.","solutions":["If overriding delegate creation, construct the delegate with 'this' (the fully-constructed renderer), not a null.","Do not create CustomWebViewNavigationDelegate before the renderer is assigned.","Use the default WkWebViewRenderer delegate wiring unless you have a specific reason to override."],"exampleFix":"// before\nprotected override WKNavigationDelegate CreateNavDelegate() => new CustomWebViewNavigationDelegate(_notSet);\n\n// after\nprotected override WKNavigationDelegate CreateNavDelegate() => new CustomWebViewNavigationDelegate(this);","handlingStrategy":"validation","validationCode":"if (renderer == null) throw new ArgumentNullException(nameof(renderer));\nvar del = new CustomWebViewNavigationDelegate(renderer);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Create the navigation delegate with a fully-constructed renderer ('this').","Do not override delegate creation with partial-state renderers."],"tags":["argumentnullexception","ios","webview","wkwebview","delegate-wiring"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}