2015-06-16 795 views
5

我想在WinForms应用程序中使用CefSharp浏览器控件以及LocalStorage机制。
问题是,应用程序中的浏览器控件更改为LocalStorage不会影响其他浏览器窗口,并且不会从其他Chrome浏览器窗口获取更改。
HTML在本地Chrome浏览器内部工作,并更改localstorage并获取更改通知。
我错过了什么?WinForms CefSharp浏览器LocalStorage不工作

C#代码:

public Form1() 
    { 
     InitializeComponent(); 

     CefSharp.Cef.Initialize(); 

     _browser = new ChromiumWebBrowser(URL_TO_LOAD); 
     _browser.BrowserSettings = new CefSharp.BrowserSettings() 
     { 
      ApplicationCacheDisabled = false, 
      FileAccessFromFileUrlsAllowed = true, 
      JavascriptDisabled = false, 
      LocalStorageDisabled = false, 
      WebSecurityDisabled = true, 
      JavaScriptOpenWindowsDisabled = false, 
      JavascriptDomPasteDisabled = false 
     }; 
     _browser.Load(URL_TO_LOAD); 

     splitContainer1.Panel1.Controls.Add(_browser); 
    } 

HTML:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
     <meta charset="utf-8"/> 
     <meta name="viewport" content="width=620"/> 
     <title>HTML5 Demo: Storage Events</title> 
</head> 
<body> 
    <div> 
     <p> 
      <label for="data">Your test data:</label> <input type="text" 
       name="data" value="" placeholder="change me" id="data" /> 
     </p> 
     <p id="fromEvent">Waiting for data via<code>storage</code>event... 
     </p> 
    </div> 
    <SCRIPT type="text/javascript"> 
    var addEvent = (function() { 
      if (document.addEventListener) { 
      return function (el, type, fn) { 
       if (el && el.nodeName || el === window) { 
       el.addEventListener(type, fn, false); 
       } else if (el && el.length) { 
       for (var i = 0; i < el.length; i++) { 
        addEvent(el[i], type, fn); 
       } 
       } 
      }; 
      } else { 
      return function (el, type, fn) { 
       if (el && el.nodeName || el === window) { 
       el.attachEvent('on' + type, function() { return fn.call(el, window.event); }); 
       } else if (el && el.length) { 
       for (var i = 0; i < el.length; i++) { 
        addEvent(el[i], type, fn); 
       } 
       } 
      }; 
      } 
     })(); 
    </SCRIPT> 
    <script> 
     alert("localStorage: " + localStorage); 

     var dataInput = document.getElementById('data'), output = document 
       .getElementById('fromEvent'); 
     addEvent(window, 'storage', function(event) { 
      alert('change notification'); 
      if (event.key == 'storage-event-test') { 
       output.innerHTML = event.newValue; 
      } 
     }); 
     addEvent(dataInput, 'keyup', function() { 
      localStorage.setItem('storage-event-test', this.value); 
     }); 

     var curStorageVal = localStorage.getItem('storage-event-test'); 
     if(curStorageVal != null && curStorageVal != '') 
     { 
      output.innerHTML = curStorageVal; 
     } 
    </script> 


</body> 
</html> 

回答

2

除非你在一个CefSharp.CefSettings对象设定的路径的缓存位置,并把它传递给Cef.Initialize()方法,每次您的应用程序浏览器将创建一个新的缓存实例,当您的应用退出时,该缓存实例将被丢弃。

缓存实例还包含您的localStorage数据以及任何cookie (您可能希望保持用户登录?)以及其他内容。

我有同样的问题,但在这里找到了解决办法:https://github.com/cefsharp/CefSharp/blob/v39.0.2/CefSharp.Example/CefExample.cs#L30-L32

最小的解决方案是简单地把它添加到您的应用程序的启动程序,就像你Program.Main或你的情况,你Form1类的构造函数:

var settings = new CefSharp.CefSettings 
{ 
    CachePath = "cache" 
}; 

CefSharp.Cef.Initialize(settings);