Closed Bug 666693 Opened 13 years ago Closed 12 years ago

Remote IndexedDB for multiple IndexedDB-using processes

Categories

(Core :: Storage: IndexedDB, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla15
blocking-kilimanjaro +
blocking-basecamp +

People

(Reporter: benjamin, Assigned: bent.mozilla)

References

Details

(Keywords: dev-doc-complete)

Attachments

(2 files, 4 obsolete files)

IndexDB got hacked to work with a single content process in bug 616494, but multiple content processes are a priority for desktop Firefox, so we have to fix this the "right way" by remoting the database access to the chrome process. This may also require some additional synchronization, because content from the same domain may be making indexdb requests from multiple content processes.
Blocks: 641683
No longer blocks: e10s
Summary: Remote IndexDB for multiple content processes → Remote IndexedDB for multiple content processes
Assignee: bent.mozilla → khuey
Are multiple content processes to a state where I would be able to test racing writes to the same DB from different processes?
In the e10s repo, yes. That hasn't merged to m-c because of trees and other stuff.
Component: DOM → DOM: IndexedDB
Whiteboard: [secr:curtisk:744940]
I disagree that this needs security review.
Whiteboard: [secr:curtisk:744940] → [sec-assigned:curtisk:744940]
You can get an easy startup assertion by starting a b2g build with the patch in bug 749018 and a recent Gaia.
I learned from bent that IDB-from-workers is on the radar too.  Let's implement the cross-context communication side of this by a PIndexedDB (or whatever) protocol.  We can use cross-thread IPDL support to do worker<-->main-thread comm in single-process with the same code that does content-process<-->chrome-process.  It also allows us to do worker-thread<-->chrome-process direct comm with no other changes.
This is extremely high priority.  We need to find a victim^Wassignee.  Let's chat next week.

It blocks all of b2g multi-process architecture except (in a limited way) tabs in browser apps.
No longer depends on: 752171
Kyle is on it :)
bent, where are your WIP patch(es) from last week's work week?  Don't bogart the good stuff! ;)
Attached patch Snapshot 1 (obsolete) — Splinter Review
First snapshot. Databases load, version upgrades can happen, object stores and indexes can be created/deleted. Additional transactions can be created.

Working on Add/Put now.
Assignee: khuey → bent.mozilla
Summary: Remote IndexedDB for multiple content processes → Remote IndexedDB for multiple IndexedDB-using processes
No longer blocks: 641683, b2g-e10s-work, 749018
No longer depends on: 521898, 664029, 744940, 753159, 619494, 752171
Attached patch Snapshot 2 (obsolete) — Splinter Review
Now all object store and index methods are implemented with the exception of cursors. Those are next.
Attachment #625308 - Attachment is obsolete: true
Attached patch Snapshot 3 (obsolete) — Splinter Review
Everything should be implemented now. Works fine on my test page, but I'm sure there are bugs lurking somewhere. And some cleanup maybe. I'll work on getting tests going now, but this is ready to start looking at.
Attachment #626697 - Attachment is obsolete: true
Attachment #627334 - Flags: feedback?(jonas)
Attachment #627334 - Flags: feedback?(jones.chris.g)
Attached patch Snapshot 4 (obsolete) — Splinter Review
All in-process tests pass with this. Working on out-of-process tests.
Attachment #627334 - Attachment is obsolete: true
Attachment #627334 - Flags: feedback?(jones.chris.g)
Attachment #627334 - Flags: feedback?(jonas)
Attachment #627429 - Flags: feedback?(jones.chris.g)
Attachment #627429 - Flags: feedback?(jonas)
Attached patch Patch, v1Splinter Review
Attachment #627429 - Attachment is obsolete: true
Attachment #627429 - Flags: feedback?(jones.chris.g)
Attachment #627429 - Flags: feedback?(jonas)
Attachment #628081 - Flags: review?(jones.chris.g)
Attachment #628081 - Flags: review?(jonas)
Whiteboard: [sec-assigned:curtisk:744940] → [sec-assigned:curtisk:744940][b2g:blocking+]
Comment on attachment 628081 [details] [diff] [review]
Patch, v1

I have very few comments because
 - we discussed the design quite a bit at the work week, so nothing is
   architecturally suprising here
 - we discussed the implementation at a high level for common IPC bugs
   I would normally flag (not your first rodeo!)
 - I barely understand the meat of the IDB code.

So take my r+ for what it's worth.

>diff --git a/dom/indexedDB/AsyncConnectionHelper.cpp b/dom/indexedDB/AsyncConnectionHelper.cpp

>+    ChildProcessSendResult sendResult =
>+      IndexedDatabaseManager::IsMainProcess() ?
>+      MaybeSendResponseToChildProcess(mResultCode) :
>+      Success_NotSent;
>+

I would recommend striking mentions of "ChildProcess" since this
should be mostly process/thread-neutral.

>diff --git a/dom/indexedDB/ipc/IndexedDBParent.cpp b/dom/indexedDB/ipc/IndexedDBParent.cpp

>+void
>+IndexedDBParent::ActorDestroy(ActorDestroyReason aWhy)
>+{
>+  // XXXbent Need to invalidate transactions from this process...

I'm not exactly sure what this means.  Is this something not taken
care of by subprotocol ActorDestroy()?

>diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp

>+bool
>+TabParent::RecvPIndexedDBConstructor(PIndexedDBParent* aActor,
>+                                     const nsCString& aASCIIOrigin,
>+                                     bool* aAllowed)
>+{
>+  // XXX Security checks, pref checks.

What's missing here?

>+  nsCOMPtr<nsINode> node = do_QueryInterface(GetOwnerElement());
>+  NS_ENSURE_TRUE(node, false);
>+
>+  nsIDocument* doc = node->GetOwnerDocument();
>+  NS_ENSURE_TRUE(doc, false);
>+
>+  nsCOMPtr<nsPIDOMWindow> window = doc->GetInnerWindow();
>+  NS_ENSURE_TRUE(window, false);
>+

This code makes me a little nervous ... are you sure these things are
always guaranteed to be findable?  I guess race conditions on shutdown
would just trigger content-process termination, which would happen
soon anyway.
Attachment #628081 - Flags: review?(jones.chris.g) → review+
blocking-basecamp: --- → +
blocking-kilimanjaro: --- → +
Whiteboard: [sec-assigned:curtisk:744940][b2g:blocking+] → [sec-assigned:curtisk:744940]
Comment on attachment 628081 [details] [diff] [review]
Patch, v1

Review of attachment 628081 [details] [diff] [review]:
-----------------------------------------------------------------

I really think it would have been much simpler to remote the database communication rather than remoting the whole DOM API. But it's not worth rewriting to do that at this point.


Anyhow, please document all the things.

r+ with that fixed.

::: dom/base/nsGlobalWindow.cpp
@@ +8062,5 @@
>      }
>  
> +    nsRefPtr<indexedDB::IndexedDatabaseManager> mgr =
> +      indexedDB::IndexedDatabaseManager::GetOrCreate();
> +    NS_ENSURE_TRUE(mgr, false);

Document why this is needed

::: dom/indexedDB/AsyncConnectionHelper.h
@@ +44,5 @@
> +    Error
> +  };
> +
> +  virtual ChildProcessSendResult
> +  MaybeSendResponseToChildProcess(nsresult aResultCode) = 0;

Just return a bool

::: dom/indexedDB/IDBCursor.cpp
@@ -565,5 @@
>  
> -  if (!key.IsUnset()) {
> -    switch (mDirection) {
> -      case IDBCursor::NEXT:
> -      case IDBCursor::NEXT_UNIQUE:

Let's keep this stuff here. No need to run these checks in the parent process too.

::: dom/indexedDB/IDBCursor.h
@@ +58,5 @@
>      NEXT_UNIQUE,
>      PREV,
> +    PREV_UNIQUE,
> +
> +    DIRECTION_INVALID

You know what to do.

::: dom/indexedDB/IDBDatabase.cpp
@@ +318,5 @@
> +  NS_ENSURE_TRUE(objectStore, NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
> +
> +  if (IndexedDatabaseManager::IsMainProcess()) {
> +    nsRefPtr<CreateObjectStoreHelper> helper =
> +      new CreateObjectStoreHelper(aTransaction, objectStore);

Feel free to file a followup on maybe fixing this up to do everything through the helper.

::: dom/indexedDB/IDBObjectStore.cpp
@@ +681,5 @@
> +    ipc::ObjectStoreConstructorParams params;
> +
> +    if (aCreating) {
> +      ipc::CreateObjectStoreParams createParams;
> +      createParams.info() = *static_cast<ObjectStoreInfoGuts*>(aStoreInfo);

No need for explicit cast here.

@@ +2441,5 @@
> +  return NS_OK;
> +}
> +
> +nsresult
> +ObjectStoreHelper::OnParentProcessRequestComplete(

Can we move this to the base AsyncConnectionHelper? And only override for the open-related requests.

@@ +2842,5 @@
> +  return NS_OK;
> +}
> +
> +HelperBase::ChildProcessSendResult
> +GetHelper::MaybeSendResponseToChildProcess(nsresult aResultCode)

I'd say just use mResultCode rather than passing it here, but I'm fine either way.

::: dom/indexedDB/IDBTransaction.h
@@ +126,5 @@
>    }
>  
>    bool IsAborted() const
>    {
> +    return !!mAbortCode;

return NS_FAILED(...);

::: dom/indexedDB/IndexedDatabaseManager.cpp
@@ +206,5 @@
> +    if (NS_FAILED(Preferences::AddIntVarCache(&gIndexedDBQuotaMB,
> +                                              PREF_INDEXEDDB_QUOTA,
> +                                              DEFAULT_QUOTA_MB))) {
> +      NS_WARNING("Unable to respond to quota pref changes!");
> +      gIndexedDBQuotaMB = DEFAULT_QUOTA_MB;

Just do this for the main process

@@ +711,5 @@
>      NS_ENSURE_SUCCESS(rv, rv);
>  
> +    if (StringEndsWith(leafName, NS_LITERAL_STRING(".sqlite-journal"))) {
> +      continue;
> +    }

We should backport this. Please file a separate bug.

@@ +908,5 @@
>  
>      if (aASCIIOrigin.EqualsLiteral("null")) {
>        NS_WARNING("IndexedDB databases not allowed for this principal!");
> +      // XXXbent remove this
> +      return NS_OK;

you *should* remove this :)

::: dom/indexedDB/Key.cpp
@@ +158,5 @@
>          nsresult rv = EncodeJSValInternal(aCx, val, aTypeOffset,
>                                            aRecursionDepth + 1);
> +        if (NS_FAILED(rv)) {
> +          return rv;
> +        }

Revert this

::: dom/indexedDB/ipc/IndexedDBChild.cpp
@@ +211,5 @@
> +  }
> +
> +  nsCString str(aDBInfo.origin);
> +  str.Append("*");
> +  str.Append(NS_ConvertUTF16toUTF8(aDBInfo.name));

This seems silly/dangerous to have duplicated. Please abstract somewhere.

@@ +385,5 @@
> +
> +bool
> +IndexedDBDatabaseChild::RecvPIndexedDBTransactionConstructor(
> +                                             PIndexedDBTransactionChild* aActor,
> +                                             const TransactionParams& aParams)

Maybe add a comment that saying that this code path is just for upgradeneeded

::: dom/indexedDB/ipc/IndexedDBParent.cpp
@@ +155,5 @@
> +                                           mEventListener, false, false, 2);
> +  NS_ENSURE_SUCCESS(rv, rv);
> +
> +  rv = aRequest->AddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
> +                                  mEventListener, false, false, 2);

Just lose the last two arguments.

@@ +156,5 @@
> +  NS_ENSURE_SUCCESS(rv, rv);
> +
> +  rv = aRequest->AddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
> +                                  mEventListener, false, false, 2);
> +  NS_ENSURE_SUCCESS(rv, false);

NS_ENSURE_SUCCESS(rv, rv);

@@ +171,5 @@
> +  return NS_OK;
> +}
> +
> +nsresult
> +IndexedDBDatabaseParent::ConcreteHandleEvent(nsIDOMEvent* aEvent)

Just name this HandleEvent

@@ +246,5 @@
> +  }
> +
> +  jsval result;
> +  rv = mOpenRequest->GetResult(&result);
> +  NS_ENSURE_SUCCESS(rv, rv);

We could avoid dealing with jsval's and safe js-contexts here. Since this is a open request, we could make open requests internally hold a database pointer and then just use that pointer here. You can avoid the static cast that way too.

Up to you.

@@ +258,5 @@
> +  MOZ_ASSERT(cx);
> +
> +  nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
> +  rv = xpc->GetWrappedNativeOfJSObject(cx, JSVAL_TO_OBJECT(result),
> +                                        getter_AddRefs(wrapper));

r-!!!!!

@@ +296,5 @@
> +    nsRefPtr<IDBOpenDBRequest> request;
> +    mOpenRequest.swap(request);
> +
> +    rv = databaseConcrete->AddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
> +                                            mEventListener, false, false, 2);

Make this #ifdef DEBUG

@@ +301,5 @@
> +    NS_ENSURE_SUCCESS(rv, rv);
> +
> +    NS_NAMED_LITERAL_STRING(versionChange, VERSIONCHANGE_EVT_STR);
> +    rv = databaseConcrete->AddEventListener(versionChange, mEventListener,
> +                                            false, false, 2);

Remove last two arguments.

@@ +309,5 @@
> +      return NS_ERROR_FAILURE;
> +    }
> +
> +    if (mDatabase) {
> +      MOZ_ASSERT(mDatabase == databaseConcrete);

Just do

MOZ_ASSERT(!mDatabase || mDatabase == databaseConcrete);
mDatabase = databaseConcrete;

Just for the fun of it :)

@@ +367,5 @@
> +  nsresult rv;
> +
> +  if (aType.EqualsLiteral(ERROR_EVT_STR)) {
> +    rv = aEvent->PreventDefault();
> +    NS_ENSURE_SUCCESS(rv, rv);

Make this #ifdef DEBUG and just assert that we don't get here

@@ +1691,5 @@
> +    NS_ENSURE_SUCCESS(rv, false);
> +  }
> +
> +  nsRefPtr<IDBRequest> request = mCursor->Request();
> +  MOZ_ASSERT(request);

Just make this mRequest = mCursor->...

::: dom/indexedDB/ipc/SerializationHelpers.h
@@ +55,5 @@
> +  typedef mozilla::dom::indexedDB::IndexInfo paramType;
> +
> +  static void Write(Message* aMsg, const paramType& aParam)
> +  {
> +    WriteParam(aMsg, aParam.name);

Add a comment to DatabaseInfo.h to make sure people don't forget to add here too.

::: gfx/layers/d3d10/ThebesLayerD3D10.cpp
@@ +567,5 @@
>    NS_ABORT_IF_FALSE(mTexture, "Couldn't open foreign texture");
>  
>    // The content process tracks back/front buffers on its own, so
>    // the newBack is in essence unused.
> +  *aNewBack = aNewFront;

Chris needs to review this.

::: ipc/app/MozillaRuntimeMain.cpp
@@ +29,2 @@
>      MessageBox(NULL, L"Hi", L"Hi", MB_OK);
>  #endif

Just nuke this instead

::: ipc/glue/WindowsMessageLoop.cpp
@@ +292,5 @@
>          }
>  
>          log.AppendLiteral(", sending it to DefWindowProc instead of the normal "
>                            "window procedure.");
> +        NS_WARNING(log.get());

Revert this
Attachment #628081 - Flags: review?(jonas) → review+
These are bug fixes and tests. On top of other patch.
Attachment #629015 - Flags: review?(jonas)
Comment on attachment 629015 [details] [diff] [review]
Bug fixes and tests, v1

Review of attachment 629015 [details] [diff] [review]:
-----------------------------------------------------------------

r=me with the TestRunner.js change explained.

::: ipc/app/MozillaRuntimeMain.cpp
@@ +24,5 @@
>  
>  int
>  main(int argc, char* argv[])
>  {
> +#if defined(XP_WIN)

I don't think you want to check this in.

::: testing/mochitest/tests/SimpleTest/TestRunner.js
@@ +172,5 @@
>  
> +TestRunner.generateFailureList = function () {
> +    if (TestRunner._failureFile) {
> +        var failures = new SpecialPowersLogger(TestRunner._failureFile);
> +        failures.log(JSON.stringify(TestRunner._failedTests));

I don't understand this change.
Attachment #629015 - Flags: review?(jonas) → review+
(In reply to Chris Jones [:cjones] [:warhammer] from comment #15)
> >+    ChildProcessSendResult sendResult =
> 
> I would recommend striking mentions of "ChildProcess" since this
> should be mostly process/thread-neutral.

Yeah, we're going to remove it as soon as we finish blob support.

> >+  // XXXbent Need to invalidate transactions from this process...
> 
> I'm not exactly sure what this means.  Is this something not taken
> care of by subprotocol ActorDestroy()?

Subprotocol ActorDestroy was handling it just fine so I removed this.

> >+  // XXX Security checks, pref checks.
> 
> What's missing here?

Mainly I was thinking about integrating indexedDB with our B2G security model... You know, comparing the requesting app to the web store permission list, the user granted permission list, etc. Not relevant until we have all that in place, so I removed this.

> This code makes me a little nervous ... are you sure these things are
> always guaranteed to be findable?  I guess race conditions on shutdown
> would just trigger content-process termination, which would happen
> soon anyway.

For now I'm fine killing the child if any of those things aren't findable. If we figure out some legitimate case where they're not then I'll definitely relax it, but right now I can't think of any.

(In reply to Jonas Sicking (:sicking) from comment #16)
> > +  virtual ChildProcessSendResult
> > +  MaybeSendResponseToChildProcess(nsresult aResultCode) = 0;
>
> Just return a bool

I don't remember how we decided to do that with the blob stuff not being implemented. I think we should leave this for now and then remove once we land blob support.

> > +  if (IndexedDatabaseManager::IsMainProcess()) {
> > +    nsRefPtr<CreateObjectStoreHelper> helper =
> > +      new CreateObjectStoreHelper(aTransaction, objectStore);
> 
> Feel free to file a followup on maybe fixing this up to do everything
> through the helper.

Bug 760598

> > +    if (StringEndsWith(leafName, NS_LITERAL_STRING(".sqlite-journal"))) {
> > +      continue;
> > +    }
> 
> We should backport this. Please file a separate bug.

Bug 760600

> > +        if (NS_FAILED(rv)) {
> > +          return rv;
> > +        }
> 
> Revert this

I think we're going to have to agree to disagree here ;)

> > +  rv = aRequest->AddEventListener(NS_LITERAL_STRING(ERROR_EVT_STR),
> > +                                  mEventListener, false, false, 2);
> 
> Just lose the last two arguments.

I did this, but it caused extra headaches (had to cast to nsIDOMEventTarget* before it would work since nsDOMEventTargetHelper has several overrides of AddEventListener that shadow).

> > +  *aNewBack = aNewFront;
> 
> Chris needs to review this.

He basically wrote it ;)

(In reply to Jonas Sicking (:sicking) from comment #18)
> I don't understand this change.

I explained over irc, but for the record, the failure file thing is an optional arg that is passed to runtests.py. Apparently we always pass it on tinderbox, but if you don't then TestRunner.py blows up. I just kept it optional.
https://hg.mozilla.org/mozilla-central/rev/d7d612dd7255
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla15
Soooo this is burning SeaMonkey with the following error... (from http://tinderbox.mozilla.org/showlog.cgi?log=SeaMonkey/1338739676.1338739983.6604.gz&fulltext=1#err0 ) Going to mark for clobber but I'm not holding my breath.

=========

/e/builds/slave/comm-cen-trunk-w32/build/objdir/mozilla/_virtualenv/Scripts/python.exe -O /e/builds/slave/comm-cen-trunk-w32/build/mozilla/build/cl.py cl -FoIDBCursor.obj -c -D_HAS_EXCEPTIONS=0 -I../../dist/stl_wrappers  -D_IMPL_NS_LAYOUT -DMOZILLA_INTERNAL_API -D_IMPL_NS_COM -DEXPORT_XPT_API -DEXPORT_XPTC_API -D_IMPL_NS_GFX -D_IMPL_NS_WIDGET -DIMPL_XREAPI -DIMPL_NS_NET -DIMPL_THEBES  -DMOZ_SUITE=1 -DEXCLUDE_SKIA_DEPENDENCIES  -DUNICODE -D_UNICODE -DNOMINMAX -D_CRT_RAND_S -DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS -D_SECURE_ATL -DCHROMIUM_BUILD -DU_STATIC_IMPLEMENTATION -DOS_WIN=1 -DWIN32 -D_WIN32 -D_WINDOWS -DWIN32_LEAN_AND_MEAN  -DCOMPILER_MSVC -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/db/sqlite3/src -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/xpcom/build -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/dom/base -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/dom/src/storage -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/content/base/src -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/content/events/src  -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/ipc/chromium/src -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/ipc/glue -I../../ipc/ipdl/_ipdlheaders  -I/e/builds/slave/comm-cen-trunk-w32/build/mozilla/dom/indexedDB -I. -I../../dist/include -I../../dist/include/nsprpub  -Ie:/builds/slave/comm-cen-trunk-w32/build/objdir/mozilla/dist/include/nspr -Ie:/builds/slave/comm-cen-trunk-w32/build/objdir/mozilla/dist/include/nss        -TP -nologo -W3 -Gy -Fdgenerated.pdb -wd4800 -we4553  -DNDEBUG -DTRIMMED -Zi -UDEBUG -DNDEBUG -O1 -Oy -MD            -FI ../../dist/include/mozilla-config.h -DMOZILLA_CLIENT /e/builds/slave/comm-cen-trunk-w32/build/mozilla/dom/indexedDB/IDBCursor.cpp
IDBCursor.cpp

e:/builds/slave/comm-cen-trunk-w32/build/mozilla/dom/indexedDB/IDBCursor.cpp(42) : error C2872: 'ipc' : ambiguous symbol

        could be 'mozilla::dom::indexedDB::ipc'

        or 'mozilla::ipc'

make[6]: Leaving directory `/e/builds/slave/comm-cen-trunk-w32/build/objdir/mozilla/dom/indexedDB'
...actually it broke the nightly too, so its not just that
That's really strange, why wouldn't it burn FF and TB also? Anyway, the fix is simple, just clarify that it's "mozilla::dom::indexedDB::ipc" there.
(In reply to ben turner [:bent] from comment #24)
> That's really strange, why wouldn't it burn FF and TB also?

My guess would be this is related to (still) compiling with MSVC8 (not MSVC10).
Depends on: 756108
Version: unspecified → Trunk
Blocks: 761136
No longer blocks: 761136
Depends on: 761136
Depends on: 761635
No longer depends on: 756108
(In reply to Serge Gautherie (:sgautherie) from comment #25)
> My guess would be this is related to (still) compiling with MSVC8 (not
> MSVC10).

Bug 761635 Submitted
Flags: in-testsuite+
This sounds important to verify; is there a clear QA-reproducible testcase that we can run through, and if so, can you please change [qa?] to [qa+] in the whiteboard status, with steps?  Thanks!
Whiteboard: [sec-assigned:curtisk:744940] → [sec-assigned:curtisk:744940][qa?]
This is an extremely complicated feature (the diff is half a megabyte) ... there isn't a single test case that could cover this all.
(In reply to Kyle Huey [:khuey] (khuey@mozilla.com) from comment #28)
> This is an extremely complicated feature (the diff is half a megabyte) ...
> there isn't a single test case that could cover this all.

(Clearing qa?, and my apologies for the spam.  We jumped the gun on some bug-verification process without understanding the full implications.  We'll follow up with a better method--shared with dev--for the next iteration.)
Whiteboard: [sec-assigned:curtisk:744940][qa?] → [sec-assigned:curtisk:744940]
Flags: sec-review?(curtisk)
Why do we need a security review of this? This doesn't make any functional changes.
Whiteboard: [sec-assigned:curtisk:744940]
dveditz can you respond to comment 30 please
Flags: needinfo?(dveditz)
Flags: sec-review?(curtisk)
Flags: needinfo?(dveditz)
ddc'ing this; not sure what documentation it needs really, as it doesn't make a difference to web developers, afaics.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: