From 5abe27f423e19e73665bf7f069820b9e9bd6f1ef Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 19 Mar 2016 21:40:29 +0530 Subject: [PATCH] Detect support for storing blobs in IndexedDB --- src/pyj/read_book/db.pyj | 36 +++++++++++++++++++++++++++--------- src/pyj/read_book/ui.pyj | 8 ++++++-- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/pyj/read_book/db.pyj b/src/pyj/read_book/db.pyj index bfd67d0660..9f4b94b86e 100644 --- a/src/pyj/read_book/db.pyj +++ b/src/pyj/read_book/db.pyj @@ -15,9 +15,12 @@ DB_NAME = 'calibre-books-db-test' # TODO: Remove test suffix class DB: - def __init__(self, idb, interface_data): - self.interface_data = interface_data + def __init__(self, idb, ui, supports_blobs): + self.interface_data = ui.interface_data self.idb = idb + self.supports_blobs = supports_blobs + if not supports_blobs: + print('IndexedDB does not support Blob storage, using base64 encoding instead') idb.onerror = def(event): self.display_error(None, event) @@ -80,6 +83,8 @@ class DB: book.manifest = manifest book.metadata = manifest.metadata book.book_hash = manifest.book_hash.hash + book.is_complete = False + book.stores_blobs = True v'delete manifest["metadata"]' self.do_op(['books'], book, _('Failed to write to the books database'), proceed, op='put') @@ -88,12 +93,25 @@ def create_db(ui, interface_data): ui.db = _('Your browser does not support IndexedDB. Cannot read books. Consider using a modern browser, such as Firefox, Chrome or Edge.') return request = window.indexedDB.open(DB_NAME, 1) - request.onblocked = def(event): - alert(_('Please close all other tabs with a calibre book open')) - request.onerror = def(event): - ui.db = _('You must allow calibre to use IndexedDB storage in your browser to read books') - request.onsuccess = def(event): - ui.db = DB(event.target.result, interface_data) - ui.db_initialized() + request.onupgradeneeded = def(event): upgrade_schema(event.target.result, event.oldVersion, event.newVersion) + + request.onblocked = def(event): + alert(_('Please close all other tabs with a calibre book open')) + + request.onerror = def(event): + ui.db = _('You must allow calibre to use IndexedDB storage in your browser to read books') + + request.onsuccess = def(event): + blob = Blob(['test'], {'type':"text/plain"}) + idb = event.target.result + try: + req = idb.transaction(['files'], 'readwrite').objectStore('files').put(blob, ':-test-blob-:') + except Exception: + ui.db_initialized(DB(idb, ui, False)) + return + req.onsuccess = def(event): + ui.db_initialized(DB(idb, ui, True)) + req.onerror = def(event): + ui.db_initialized(DB(idb, ui, False)) diff --git a/src/pyj/read_book/ui.pyj b/src/pyj/read_book/ui.pyj index 4251246030..b3a23e285f 100644 --- a/src/pyj/read_book/ui.pyj +++ b/src/pyj/read_book/ui.pyj @@ -24,7 +24,8 @@ class ReadUI: return self.start_load(book_id, fmt, metadata) - def db_initialized(self): + def db_initialized(self, db): + self.db = db if self.pending_load is not None: pl, self.pending_load = self.pending_load, None self.start_load(*pl) @@ -41,7 +42,7 @@ class ReadUI: if not book.manifest or book.manifest.version != RENDER_VERSION: self.get_manifest(book) return - self.download_book(book) + self.display_book(book) if book.is_complete else self.download_book(book) def get_manifest(self, book): library_id, book_id, fmt = book.key @@ -74,3 +75,6 @@ class ReadUI: def download_book(self, book): pass + + def display_book(self, book): + pass