Протокол localStorage и file: протокол не является постоянным, SQLite дает SECURITY_ERR - PullRequest
3 голосов
/ 24 сентября 2011

Введение

Я работаю с RapidWeaver - приложением Mac OS X CMS - и оно не использует серверную среду. Имеет редактор и режим предварительного просмотра. Режим предварительного просмотра - это рендерер на основе Webkit, и я могу использовать «Inspect Element», как вы обычно можете это сделать в Safari.

Я хочу сохранить некоторые настройки для панели инструментов, используя localStorage или SQLite . Я прочитал некоторую информацию об indexedDB, хотя я не нашел конкретных реализаций о том, как его использовать.

Проблемы с локальным хранилищем

localStorage отлично работает, когда я нахожусь в режиме предварительного просмотра, когда я переключаюсь между редактором и режимом предварительного просмотра, url - location.href - немного изменяется:

file:///private/var/folders/s7/x8y2s0sd27z6kdt2jjdw7c_c0000gn/T/TemporaryItems/RapidWeaver/98970/document-143873968-28/RWDocumentPagePreview/code/styled/index.html

file:///private/var/folders/s7/x8y2s0sd27z6kdt2jjdw7c_c0000gn/T/TemporaryItems/RapidWeaver/98970/document-143873968-29/RWDocumentPagePreview/code/styled/index.html

document-143873968- 28 изменяется на документ-143873968- 29

То, что я читал о localStorage, это то, что это в основном globalStorage [location.hostname] для FireFox. Насколько я знаю, globalStorage не поддерживается в Safari, поэтому я не могу попробовать это.

Проблемы с SQLite

Когда я пытаюсь открыть базу данных:

var shortName = 'mydatabase';
var version = '1.0';
var displayName = 'My Important Database';
var maxSize = 65536; // in bytes
var db = openDatabase(shortName, version, displayName, maxSize);

Я получаю это в моей консоли:

SECURITY_ERR: DOM Exception 18: An attempt was made to break through the security policy of the user agent.

Это в основном завершает мой вопрос, я буду признателен за любые ответы или комментарии искренне.

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Используя следующее решение: Реализация делегата квоты на базу данных WebView с несколькими изменениями, я смог заставить его работать.

Следующий метод делегата работал для меня (укажитеwebViewDelegate):

- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier
{
  static const unsigned long long defaultQuota = 5 * 1024 * 1024;
  if ([origin respondsToSelector: @selector(setQuota:)]) {
    [origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]];
  } else { 
    NSLog(@"could not increase quota for %@", defaultQuota); 
  }
}

По умолчанию базе данных дается 0 байтов, что приводит к неопределенному сообщению об ошибке, которое вы получили выше.Вышеуказанный метод вызывается после попытки создания базы данных, когда не хватает места.Обратите внимание, что этот метод определен в WebUIDelegatePrivate.h (http://opensource.apple.com/source/WebKit/WebKit-7533.16/mac/WebView/WebUIDelegatePrivate.h), и его использование может помешать отправке приложения в магазин приложений Mac.

1 голос
/ 24 сентября 2011

localStorage - это механизм html5, который дает сценариям немного больше места, чем файлы cookie. Safari поддерживает это: https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Name-ValueStorage/Name-ValueStorage.html

Я не знаю, какие ограничения пути должны быть установлены для приложений на базе file: ///.

Редактировать: изучая ограничения пути дальше, я вижу, что то, что вы получили, должно работать с Safari, FF недавно исправил ошибку, которая не давала там работать: https://bugzilla.mozilla.org/show%5Fbug.cgi?id=507361

...