Closed
Bug 832883
Opened 12 years ago
Closed 11 years ago
Move IDBKeyRange to WebIDL and define indexedDB/IDBKeyRange in all the spots
Categories
(Core :: Storage: IndexedDB, defect)
Core
Storage: IndexedDB
Tracking
()
RESOLVED
FIXED
mozilla27
People
(Reporter: Ms2ger, Assigned: janv)
References
(Depends on 2 open bugs, Blocks 1 open bug, Regressed 1 open bug)
Details
Attachments
(1 file, 6 obsolete files)
103.81 KB,
patch
|
bent.mozilla
:
review+
|
Details | Diff | Splinter Review |
No description provided.
Reporter | ||
Comment 1•12 years ago
|
||
The main issue is IndexedDatabaseManager::InitWindowless, I think. I guess we'll need a GetConstructorObject that doesn't try to cache the result in the protoAndIfaceArray.
Attachment #704514 -
Flags: feedback?(khuey)
Is this still relevant enough to review? I suspect it may have bitrotted substantially in the last 4 months.
Reporter | ||
Comment 3•12 years ago
|
||
Attachment #704514 -
Attachment is obsolete: true
Attachment #704514 -
Flags: feedback?(khuey)
Attachment #755282 -
Flags: feedback?(khuey)
Comment on attachment 755282 [details] [diff] [review]
WIP v2
Review of attachment 755282 [details] [diff] [review]:
-----------------------------------------------------------------
Why does this need to inherit from nsWrapperCache?
Reporter | ||
Comment 5•11 years ago
|
||
Attachment #755282 -
Attachment is obsolete: true
Attachment #755282 -
Flags: feedback?(khuey)
Attachment #782286 -
Flags: review?(khuey)
Comment on attachment 782286 [details] [diff] [review]
Patch v1
Review of attachment 782286 [details] [diff] [review]:
-----------------------------------------------------------------
::: dom/indexedDB/IDBKeyRange.h
@@ +28,5 @@
> class KeyRange;
> } // namespace FIXME_Bug_521898_objectstore
> } // namespace ipc
>
> +class IDBKeyRange MOZ_FINAL : public nsISupports
I don't think this needs nsISupports anymore. Please file a followup on possibly removing it.
@@ +104,5 @@
> {
> return mIsOnly ? mLower : mUpper;
> }
>
> + // TODO: Remove these in favour of LowerOpen() / UpperOpen().
File a followup please.
::: dom/indexedDB/IndexedDatabaseManager.cpp
@@ +528,5 @@
>
> JS::Rooted<JSObject*> obj(aCx, JSVAL_TO_OBJECT(aObj));
> + if (!(js::GetObjectClass(obj)->flags & JSCLASS_DOM_GLOBAL)) {
> + return NS_ERROR_FAILURE;
> + }
Add in an NS_WARNING about using InitWindowless in a DOM global
::: dom/indexedDB/nsIIDBObjectStore.idl
@@ +90,5 @@
>
> void
> deleteIndex([Null(Stringify)] in DOMString name);
>
> + // Accepts null, a key value, or a IDBKeyRange object.
an IDBKeyRange
::: dom/webidl/IDBKeyRange.webidl
@@ +24,5 @@
> + static IDBKeyRange lowerBound (any lower, optional boolean open = false);
> + [Creator, Throws]
> + static IDBKeyRange upperBound (any upper, optional boolean open = false);
> + [Creator, Throws]
> + static IDBKeyRange bound (any lower, any upper, optional boolean lowerOpen = false, optional boolean upperOpen = false);
Can you file a spec bug on getting the default values in the IDL in the spec?
Attachment #782286 -
Flags: review?(khuey) → review+
Reporter | ||
Comment 7•11 years ago
|
||
Can we land this?
Flags: needinfo?(Ms2ger)
Reporter | ||
Comment 9•11 years ago
|
||
No, it breaks all B2G tests, like:
https://tbpl.mozilla.org/php/getParsedLog.php?id=26064836&tree=Mozilla-Central
with things like
02:28:43 WARNING - E/GeckoConsole( 45): [JavaScript Error: "[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: resource://gre/modules/PushService.jsm :: PushDB :: line 48" data: no]" {file: "resource://gre/modules/PushService.jsm" line: 48}]
02:28:43 WARNING - E/GeckoConsole( 45): [JavaScript Error: "[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: jar:file:///system/b2g/omni.ja!/components/SettingsManager.js :: SettingsManager :: line 256" data: no]" {file: "jar:file:///system/b2g/omni.ja!/components/SettingsManager.js" line: 256}]
02:28:43 WARNING - E/GeckoConsole( 45): [JavaScript Error: "NS_ERROR_FAILURE: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" {file: "jar:file:///system/b2g/omni.ja!/components/SettingsManager.js" line: 256}]
02:28:43 WARNING - E/GeckoConsole( 45): [JavaScript Error: "NS_ERROR_FAILURE: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" {file: "resource://gre/modules/ContactService.jsm" line: 42}]
02:28:43 WARNING - E/GeckoConsole( 45): [JavaScript Error: "[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: resource://gre/modules/ActivitiesService.jsm :: actdb_init :: line 42" data: no]" {file: "resource://gre/modules/ActivitiesService.jsm" line: 42}]
Flags: needinfo?(Ms2ger)
Comment 10•11 years ago
|
||
+ if (!(js::GetObjectClass(obj)->flags & JSCLASS_DOM_GLOBAL)) {
+ return NS_ERROR_FAILURE;
+ }
It seems this is the problem of B2G tests failing. Is it strictly related to IDBKeyRange?
Flags: needinfo?(Ms2ger)
Reporter | ||
Comment 11•11 years ago
|
||
The GetConstructorObject call also has that check; I added it here for explicitness and to make sure that we'd throw immediately rather than halfway through the function.
I think I saw Jan pushed something to try, though.
Flags: needinfo?(Ms2ger) → needinfo?(Jan.Varga)
Assignee | ||
Comment 12•11 years ago
|
||
Yeah, I'd like to get rid of initWindowless() altogether.
I'm officially on vacation, but I couldn't sleep last night, so I tried something :)
Expect a patch from me early next week or sooner.
Flags: needinfo?(Jan.Varga)
Assignee | ||
Comment 13•11 years ago
|
||
Ms2ger, I spoke with bent, here's the plan:
1. make idb work everywhere without initWindowless()
2. remove initWindowless()
The latter will be probably done in a separate bug.
I have a fix that does 1, I just need to do some cleanup and more testing.
So, initWindowless() will be kept for now, but with the global object requirement that you added.
Reporter | ||
Comment 14•11 years ago
|
||
Sounds good to me.
Oh, and:
1a. Make sure we have tests for all the different spots (bootstrap.js, "ipcshell", components, JSMs, jetpack sandbox, anything else?)
Assignee | ||
Comment 16•11 years ago
|
||
(In reply to ben turner [:bent] (needinfo? encouraged) from comment #15)
> Oh, and:
>
> 1a. Make sure we have tests for all the different spots (bootstrap.js,
> "ipcshell", components, JSMs, jetpack sandbox, anything else?)
I've got the tests for content, chrome windows, xpcshell, JS modules, JS components, JS sandboxes
I'm going to take a look at the ipcshell and bootstrap.js
See dom/workers/test/extensions/bootstrap/ for an example of a test extension that lets you try things in bootstrap.js.
Assignee | ||
Comment 18•11 years ago
|
||
(In reply to ben turner [:bent] (needinfo? encouraged) from comment #17)
> See dom/workers/test/extensions/bootstrap/ for an example of a test
> extension that lets you try things in bootstrap.js.
yeah, and dom/workers/test/test_extensionsBootstrap.xul
that's the last one, I added ipcshell in the meantime
I'm renaming this bug, since it would be too much work to split the patch.
Summary: Move IDBKeyRange to Paris bindings → Move IDBKeyRange to WebIDL and define indexedDB/IDBKeyRange in all the spots
Reporter | ||
Updated•11 years ago
|
Assignee: Ms2ger → Jan.Varga
Assignee | ||
Comment 19•11 years ago
|
||
Attachment #782286 -
Attachment is obsolete: true
Assignee | ||
Comment 20•11 years ago
|
||
Attachment #808756 -
Flags: review?(bent.mozilla)
Assignee | ||
Comment 21•11 years ago
|
||
Assignee | ||
Comment 22•11 years ago
|
||
Assignee | ||
Comment 23•11 years ago
|
||
Attachment #808753 -
Attachment is obsolete: true
Attachment #808756 -
Attachment is obsolete: true
Attachment #808758 -
Attachment is obsolete: true
Attachment #808756 -
Flags: review?(bent.mozilla)
Attachment #811222 -
Flags: review?(bent.mozilla)
Comment on attachment 811222 [details] [diff] [review]
all in one patch v2
Review of attachment 811222 [details] [diff] [review]:
-----------------------------------------------------------------
r=me!
::: dom/indexedDB/IDBKeyRange.cpp
@@ +65,2 @@
>
> + JS::RootedObject obj(aCx, aVal.isObject() ? &aVal.toObject() : NULL);
Nit: nullptr
@@ +158,5 @@
> DropJSObjects();
> }
>
> +JSObject*
> +IDBKeyRange::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
Nit: JS::HandleObject
@@ +210,5 @@
>
> +// static
> +already_AddRefed<IDBKeyRange>
> +IDBKeyRange::Only(const GlobalObject& aGlobal, JSContext* aCx,
> + JS::Handle<JS::Value> aValue, ErrorResult& aRv)
Nit: JS::HandleValue, here and below.
::: dom/indexedDB/IDBKeyRange.h
@@ +62,5 @@
> {
> return mIsOnly ? mLower : mUpper;
> }
>
> + // TODO: Remove these in favour of LowerOpen() / UpperOpen().
This either should be done here or a followup filed/referenced here.
::: dom/indexedDB/IndexedDatabaseManager.cpp
@@ +133,5 @@
> BINDING_ENTRY(IDBCursor)
> BINDING_ENTRY(IDBRequest)
> BINDING_ENTRY(IDBOpenDBRequest)
> BINDING_ENTRY(IDBVersionChangeEvent)
> + BINDING_ENTRY(IDBFileHandle)
Hm, I suck. Can you alphabetize this?
@@ +207,5 @@
> };
>
> +bool
> +GetIndexedDB(JSContext* aCx, JS::Handle<JSObject*> aGlobal,
> + JS::MutableHandle<JS::Value> aResult)
Nit: JS::HandleValue and JS::MutableHandleValue, here and everywhere.
@@ +210,5 @@
> +GetIndexedDB(JSContext* aCx, JS::Handle<JSObject*> aGlobal,
> + JS::MutableHandle<JS::Value> aResult)
> +{
> + NS_ASSERTION(nsContentUtils::IsCallerChrome(), "Only for chrome!");
> + NS_ASSERTION(js::GetObjectClass(aGlobal)->flags & JSCLASS_DOM_GLOBAL,
Nit: MOZ_ASSERT, here and everywhere you're adding new code.
@@ +221,5 @@
> + }
> +
> + NS_ASSERTION(factory, "This should never fail for chrome!");
> +
> + if (!WrapNewBindingObject(aCx, aGlobal, factory, aResult)) {
Just return !!Wrap...
@@ +230,5 @@
> +}
> +
> +bool
> +IndexedDBLazyGetter(JSContext* aCx, JS::Handle<JSObject*> aGlobal,
> + JS::Handle<jsid> aId, JS::MutableHandle<JS::Value> aVp)
Nit: JS::HandleId
@@ +239,5 @@
> + NS_ASSERTION(JSID_IS_STRING(aId), "Bad id!");
> + NS_ASSERTION(JS_FlatStringEqualsAscii(JSID_TO_FLAT_STRING(aId), IDB_STR),
> + "Bad id!");
> +
> + JS::Rooted<JS::Value> indexedDB(aCx);
Nit: JS::RootedValue
@@ +244,5 @@
> + if (!GetIndexedDB(aCx, aGlobal, &indexedDB)) {
> + return false;
> + }
> +
> + if (!JS_DeletePropertyById(aCx, aGlobal, aId) ||
I'm not sure that you need to do this. JS_Define should be enough.
@@ +250,5 @@
> + JSPROP_ENUMERATE)) {
> + return false;
> + }
> +
> + return JS_GetPropertyById(aCx, aGlobal, aId, aVp);
You should just do aVp.set(indexedDB) here, no need to go through the engine again.
@@ +482,5 @@
>
> // static
> bool
> +IndexedDatabaseManager::DefineConstructors(JSContext* aCx,
> + JS::Handle<JSObject*> aGlobal)
All these functions need main thread assertions.
@@ +524,5 @@
> + NS_ASSERTION(nsContentUtils::IsCallerChrome(), "Only for chrome!");
> + NS_ASSERTION(js::GetObjectClass(aGlobal)->flags & JSCLASS_DOM_GLOBAL,
> + "Passed object is not a global object!");
> +
> + JSString* indexedDBStr = JS_InternString(aCx, IDB_STR);
There's no real reason to intern anything here since you're only using the string once. Just use JS_DefineProperty directly.
@@ +531,5 @@
> + }
> +
> + jsid indexedDBId = INTERNED_STRING_TO_JSID(aCx, indexedDBStr);
> +
> + if (!JS_DefinePropertyById(aCx, aGlobal, indexedDBId, JSVAL_VOID,
Nit: Just return the result directly instead if |if (!) { return false; } return true;|
@@ +752,3 @@
>
> bool hasIndexedDB;
> + if (!JS_HasProperty(aCx, global, "indexedDB", &hasIndexedDB)) {
Nit: Use your IDB_STR here
::: dom/indexedDB/test/chromeHelpers.js
@@ +35,5 @@
> +}
> +
> +function errorHandler(event)
> +{
> + throw new Error("indexedDB error, code " + event.target.errorCode);
This isn't right, we don't have errorCode any more. .error.name?
::: js/xpconnect/src/Sandbox.cpp
@@ +910,5 @@
>
> bool
> xpc::SandboxOptions::GlobalProperties::Define(JSContext* cx, JS::HandleObject obj)
> {
> + if (indexedDB && AccessCheck::isChrome(obj) &&
Why do we need the isChrome check here? I think this can just be asserted?
::: js/xpconnect/src/nsXPConnect.cpp
@@ +537,5 @@
> return UnexpectedFailure(NS_ERROR_FAILURE);
> }
>
> + if (nsContentUtils::IsSystemPrincipal(aPrincipal) &&
> + !IndexedDatabaseManager::DefineIndexedDBLazyGetter(aJSContext,
Make sure bholley signs off on this!
Attachment #811222 -
Flags: review?(bent.mozilla) → review+
Assignee | ||
Comment 25•11 years ago
|
||
Assignee | ||
Comment 26•11 years ago
|
||
Gabor, could you please upstream the addon-sdk changes, once it appears on m-c ?
Comment 27•11 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 11 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla27
Comment 28•11 years ago
|
||
This causes consistent fatal assertions in DEBUG builds when using google search, on at least the two devices I've tested.
Comment 29•11 years ago
|
||
(In reply to Jeff Gilbert [:jgilbert] from comment #28)
> This causes consistent fatal assertions in DEBUG builds when using google
> search, on at least the two devices I've tested.
This is bug 922837.
Comment 30•11 years ago
|
||
This appears to be causing fatal assertions in DEBUG builds on most websites.
Comment 31•11 years ago
|
||
Commit pushed to master at https://github.com/mozilla/addon-sdk
https://github.com/mozilla/addon-sdk/commit/7e07545c3e6db32ad91fa366a5279526281658fb
Bug 832883 - Move IDBKeyRange to WebIDL and define indexedDB/IDBKeyRange in all the spots. r=khuey,bent (initial work done by Ms2ger)
Comment 32•11 years ago
|
||
Commit pushed to master at https://github.com/mozilla/addon-sdk
https://github.com/mozilla/addon-sdk/commit/24471bc8b86272b36cd834980527d1ea3ba6250e
Fix a bad merge from Bug 832883.
Comment 33•11 years ago
|
||
OK, so AFAIK, you must use initWindowless to be able to acess IDB from chrome until FF26 (aurora).
But calling it in FF27 (nightly) breaks our add-on with NS_ERROR_FAILURE even though that function is still defined.
So how do you figure we should test for this?
(In reply to 4mr.minj from comment #33)
> But calling it in FF27 (nightly) breaks our add-on with NS_ERROR_FAILURE
> even though that function is still defined.
Uh oh, sounds like we broke something? Can you file a new bug please?
Comment 35•11 years ago
|
||
Sure... Bug 932345
Assignee | ||
Comment 36•11 years ago
|
||
(In reply to 4mr.minj from comment #33)
> OK, so AFAIK, you must use initWindowless to be able to acess IDB from
> chrome until FF26 (aurora).
>
> But calling it in FF27 (nightly) breaks our add-on with NS_ERROR_FAILURE
> even though that function is still defined.
>
> So how do you figure we should test for this?
Hm, take a look at this JS code:
http://mxr.mozilla.org/mozilla-central/source/addon-sdk/source/lib/sdk/indexed-db.js#30
and let me know if that doesn't work for you
Btw, this is going to change again, bug 921478.
One will have to call |Components.utils.importGlobalProperties(["indexedDB"])| to get IndexedDB e.g. in chrome.
Comment 37•11 years ago
|
||
Yes, that works in both FF25 and FF28 (nightly just updated...)
Thanks.
I'll repost your answer in my bug.
This `initWindowless()` thing is still causing me some trouble from Jetpack code for `deleteRange`. What is the approved pattern now from addons?
I did have
```
// handle misnaming bug in idb code;
let moreindexeddb = {};
Cc["@mozilla.org/dom/indexeddb/manager;1"]
.getService(Ci.nsIIndexedDatabaseManager)
.initWindowless(moreindexeddb);
```
Status: RESOLVED → REOPENED
Flags: needinfo?(Jan.Varga)
Resolution: FIXED → ---
Assignee | ||
Comment 39•11 years ago
|
||
(In reply to Gregg Lind (User Research - Test Pilot) from comment #38)
> This `initWindowless()` thing is still causing me some trouble from Jetpack
> code for `deleteRange`. What is the approved pattern now from addons?
>
> I did have
> ```
> // handle misnaming bug in idb code;
> let moreindexeddb = {};
> Cc["@mozilla.org/dom/indexeddb/manager;1"]
> .getService(Ci.nsIIndexedDatabaseManager)
> .initWindowless(moreindexeddb);
>
>
> ```
deleteRange ? where is that ?
initWindowless() is used only in indexed-db.js, no ?
Flags: needinfo?(Jan.Varga)
Comment 40•11 years ago
|
||
I think this bug is supposed to be fixed. Feel free to reopen if needed.
Status: REOPENED → RESOLVED
Closed: 11 years ago → 11 years ago
Resolution: --- → FIXED
Comment 41•11 years ago
|
||
For Firefox 27+, initWindowless throws the following error when used in a chrome:// url
[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: debugger eval code :: <TOP_LEVEL> :: line 1" data: no]
Assignee | ||
Comment 42•11 years ago
|
||
(In reply to david.richardson from comment #41)
> For Firefox 27+, initWindowless throws the following error when used in a
> chrome:// url
>
> [Exception... "Component returned failure code: 0x80004005
> (NS_ERROR_FAILURE) [nsIIndexedDatabaseManager.initWindowless]" nsresult:
> "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: debugger eval code
> :: <TOP_LEVEL> :: line 1" data: no]
that's bug 932345
You need to log in
before you can comment on or make changes to this bug.
Description
•