单机版网页启动程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

94 lines
2.3 KiB

using System;
using System.Collections.Generic;
using System.Threading;
using AOT;
using UnityEngine;
namespace ZenFulcrum.EmbeddedBrowser {
public class CookieManager {
internal readonly Browser browser;
public CookieManager(Browser browser) {
this.browser = browser;
}
private class CookieFetch {
public BrowserNative.GetCookieFunc nativeCB;
public Promise<List<Cookie>> promise;
public CookieManager manager;
public List<Cookie> result;
}
private static CookieFetch currentFetch;
/**
* Returns a list of all cookies in the browser across all domains.
*
* Note that cookies are shared between browser instances.
*
* If the browser is not ready yet (browser.IsReady or WhenReady()) this will return an empty list.
*
* This method is not reentrant! You must wait for the returned promise to resolve before calling it again,
* even on a differnet object.
*/
public IPromise<List<Cookie>> GetCookies() {
if (currentFetch != null) {
//This method Wait for the previous promise to resolve, then make your call.
//If this limitation actually affects you, let me know.
throw new InvalidOperationException("GetCookies is not reentrant");
}
Cookie.Init();
var result = new List<Cookie>();
if (!browser.IsReady || !browser.enabled) return Promise<List<Cookie>>.Resolved(result);
var promise = new Promise<List<Cookie>>();
BrowserNative.GetCookieFunc cookieFunc = CB_GetCookieFunc;
BrowserNative.zfb_getCookies(browser.browserId, cookieFunc);
currentFetch = new CookieFetch {
promise = promise,
nativeCB = cookieFunc,
manager = this,
result = result,
};
return promise;
}
[MonoPInvokeCallback(typeof(BrowserNative.GetCookieFunc))]
private static void CB_GetCookieFunc(BrowserNative.NativeCookie cookie) {
try {
if (cookie == null) {
var result = currentFetch.result;
var promise = currentFetch.promise;
currentFetch.manager.browser.RunOnMainThread(() => promise.Resolve(result));
currentFetch = null;
return;
}
currentFetch.result.Add(new Cookie(currentFetch.manager, cookie));
} catch (Exception ex) {
Debug.LogException(ex);
}
}
/**
* Deletes all cookies in the browser.
*/
public void ClearAll() {
if (browser.DeferUnready(ClearAll)) return;
BrowserNative.zfb_clearCookies(browser.browserId);
}
}
}