2015-06-16 18 views
5

Próbuję użyć kontroli przeglądarki CefSharp w aplikacji WinForms wraz z mechanizmem LocalStorage.
Problem polega na tym, że kontrola przeglądarki w aplikacji zmienia się na LocalStorage, nie wpływa na inne okna przeglądarki i nie powoduje zmian w innych oknach przeglądarki Chrome.
HTML działa w rodzimej przeglądarce Chrome i zmienia localstorage i otrzymuję powiadomienia o zmianach.
Czego mi brakuje?WinForms CefSharp Browser LocalStorage nie działa

C# Kod:

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> 

Odpowiedz

2

ile ustawić ścieżkę do lokalizacji pamięci podręcznej w CefSharp.CefSettings przedmiotu i przekazać je do metody Cef.Initialize(), za każdym razem swoją aplikację zostanie uruchomiona, przeglądarka (s) utworzy nową instancję pamięci podręcznej, która zostanie odrzucona po wyjściu z aplikacji.

Instancja pamięci podręcznej przechowuje dane localStorage, a także pliki cookie (możesz chcieć zachować logowanie użytkownika?) i inne rzeczy.

miałem ten sam problem, ale znalazłem rozwiązanie tutaj: https://github.com/cefsharp/CefSharp/blob/v39.0.2/CefSharp.Example/CefExample.cs#L30-L32

Minimalna rozwiązaniem jest po prostu dodać do procedury uruchamiania danej aplikacji, podobnie jak w Program.Main lub w przypadku, konstruktor klasie za Form1:

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

CefSharp.Cef.Initialize(settings);