apache / cordova-ios

Apache Cordova iOS
https://cordova.apache.org/
Apache License 2.0
2.16k stars 990 forks source link

CDVWebViewEngine needs a way to set the websiteDataStore of its configuration #900

Closed msmtamburro closed 6 months ago

msmtamburro commented 4 years ago

Feature Request

Motivation Behind Feature

A websiteDataStore can both be configured (e.g., set to non-persistent) and re-used (e.g., in other web browser components).

Feature Description

Optionally exposing the configuration as typically done with the "Cordova settings" model may not suffice. For example, if you only added a Cordova setting for persistent vs. non-persistent, this would still not give us a handle to the websiteDataStore for re-use elsewhere. More specifically, allowing Cordova to use an existing websiteDataStore that was created and used prior to Cordova reaching its createConfigurationFromSettings method is important in my case. You could accomplish this by providing a protocol that allows us to return a websiteDataStore.

For example, add the following lines to CDVWebViewEngine.h:

@protocol CDVWebViewEngineConfigurationDelegate <NSObject>
/// Provides a fully configured WKWebsiteDataStore; useful for customizing configuration
- (nonnull WKWebViewConfiguration *)configuration;
@end

and then expose this property:

@property (nullable, nonatomic, weak) CDVPlugin<CDVWebViewEngineConfigurationDelegate>* configurationDelegate;

And finally, in CDVWebViewEngine.m, inside of createConfigurationFromSettings: start with:

    WKWebViewConfiguration* configuration = [_configurationDelegate configuration];
    if (configuration) {
        return configuration;
    }

Alternatives or Workarounds

When using the CDVWKWebViewEngine (the old plugin), it was possible to override createConfigurationFromSettings to customize portions of the configuration that were not exposed through Cordova settings. With the migration to CDVWebViewEngine, its private status prevents this type of customization without resorting to swizzling.

msmtamburro commented 6 months ago

Apologies: the code for this fix ended up in the (merged) PR to address 1157. I verified that everything looks good locally in cordova-ios@7.0.1. (I can successfully utilize the CDVWebViewEngineConfigurationDelegate to update the configuration of the CDVWebViewEngine.)