Closed Bug 1098270 Opened 10 years ago Closed 9 years ago

web activity in a web activity crashes

Categories

(Core :: CSS Parsing and Computation, defect)

35 Branch
defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla36
Tracking Status
firefox35 + fixed
firefox36 + fixed
firefox37 + fixed
b2g-v2.2 --- fixed

People

(Reporter: dietrich, Assigned: heycam)

Details

(Keywords: crash)

Attachments

(2 files, 1 obsolete file)

Flame, nightly channel (master + m-c), Nov 13.

This crashes b2g process for me 100% of the time.

var pick = new MozActivity({
  name: 'pick',
  data: {
    type: 'webcontacts/email'
  }
});
pick.onsuccess = function() {
  new MozActivity({
    name: 'save-bookmark',
    data: {
      type: 'url',
      url: 'http://google.com',
      name: 'asdfa'
    }
  });
};
(Have to pick a contact with an email when it comes up.)
Adding QA wanted - we need to ensure it doesn't happen on older branches that are still active.
blocking-b2g: --- → 2.2?
Keywords: qawanted
Dietrich - just to verify we understand this bug can you verify that this is the STR and actual results. Also if you could provide a build id where you saw this that would help greatly to reproduce.

Prerequisite: Have contacts on phone that have email addresses

1) Load Email app
2) Select 'Compose New Email'
3) Select '+' in the To: field
4) Select a contact with an email address

Results: Email app will crash
Flags: needinfo?(dietrich)
yeah, nothing in our UI that does this, so no in-product STR at this point.

ni? fabrice to take a look.
Flags: needinfo?(dietrich) → needinfo?(fabrice)
Keywords: qawanted
Yep. I can 100% reproduce with the page at http://people.mozilla.org/~fdesre/activities/

The stacktrace is:

Program received signal SIGSEGV, Segmentation fault.
mozilla::RestyleTracker::AddPendingRestyle (this=0x7fffd6649450, aElement=0x7fffd59982c0, aRestyleHint=eRestyle_Subtree, aMinChangeHint=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/layout/style/../base/RestyleTracker.h:485
485	      if (!(curData->mRestyleHint & eRestyle_ForceDescendants)) {
(gdb) bt
#0  mozilla::RestyleTracker::AddPendingRestyle (this=0x7fffd6649450, aElement=0x7fffd59982c0, aRestyleHint=eRestyle_Subtree, aMinChangeHint=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/layout/style/../base/RestyleTracker.h:485
#1  0x00007ffff368d3e4 in mozilla::RestyleManager::PostRestyleEventCommon (this=this@entry=0x7fffd6649400, aElement=<optimized out>, 
    aRestyleHint=aRestyleHint@entry=eRestyle_Subtree, aMinChangeHint=aMinChangeHint@entry=(unknown: 0), aForAnimation=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/layout/base/RestyleManager.cpp:1709
#2  0x00007ffff369a4be in mozilla::RestyleManager::PostRestyleEvent (this=this@entry=0x7fffd6649400, aElement=<optimized out>, 
    aRestyleHint=aRestyleHint@entry=eRestyle_Subtree, aMinChangeHint=aMinChangeHint@entry=(unknown: 0))
    at /home/fabrice/dev/b2g-inbound/layout/base/RestyleManager.h:346
#3  0x00007ffff36ece8e in nsIPresShell::ReconstructStyleDataInternal (this=this@entry=0x7fffd664ac00)
    at /home/fabrice/dev/b2g-inbound/layout/base/nsPresShell.cpp:4711
#4  0x00007ffff36ed14d in ReconstructStyleData (this=0x7fffd664ac00) at /home/fabrice/dev/b2g-inbound/layout/base/nsIPresShell.h:353
#5  PresShell::EndUpdate (this=0x7fffd664ac00, aDocument=<optimized out>, aUpdateType=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/layout/base/nsPresShell.cpp:2656
#6  0x00007ffff2d0a397 in nsDocument::EndUpdate (this=this@entry=0x7fffd67cb800, aUpdateType=2) at /home/fabrice/dev/b2g-inbound/dom/base/nsDocument.cpp:4794
#7  0x00007ffff32c5117 in nsHTMLDocument::EndUpdate (this=0x7fffd67cb800, aUpdateType=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/dom/html/nsHTMLDocument.cpp:2490
#8  0x00007ffff3618bea in mozilla::css::Loader::DoSheetComplete (this=this@entry=0x7fffd67a8240, aLoadData=aLoadData@entry=0x7fffc3874700, 
    aStatus=aStatus@entry=NS_OK, aDatasToNotify=...) at /home/fabrice/dev/b2g-inbound/layout/style/Loader.cpp:1853
#9  0x00007ffff361e213 in mozilla::css::Loader::SheetComplete (this=this@entry=0x7fffd67a8240, aLoadData=aLoadData@entry=0x7fffc3874700, 
    aStatus=aStatus@entry=NS_OK) at /home/fabrice/dev/b2g-inbound/layout/style/Loader.cpp:1780
#10 0x00007ffff361e516 in mozilla::css::Loader::ParseSheet (this=this@entry=0x7fffd67a8240, aInput=..., aLoadData=aLoadData@entry=0x7fffc3874700, 
    aCompleted=@0x7fffffff3a43: true) at /home/fabrice/dev/b2g-inbound/layout/style/Loader.cpp:1755
#11 0x00007ffff361e75a in mozilla::css::Loader::LoadInlineStyle (this=0x7fffd67a8240, aElement=0x7fffc3874580, aBuffer=..., aLineNumber=1, aTitle=..., 
    aMedia=..., aScopeElement=aScopeElement@entry=0x0, aObserver=aObserver@entry=0x0, aCompleted=aCompleted@entry=0x7fffffff3a43, 
    aIsAlternate=aIsAlternate@entry=0x7fffffff3a42) at /home/fabrice/dev/b2g-inbound/layout/style/Loader.cpp:1989
#12 0x00007ffff2d4f27c in nsStyleLinkElement::DoUpdateStyleSheet (this=this@entry=0x7fffc3874618, aOldDocument=aOldDocument@entry=0x0, 
    aOldShadowRoot=aOldShadowRoot@entry=0x0, aObserver=aObserver@entry=0x0, aWillNotify=aWillNotify@entry=0x7fffffff3d96, 
    aIsAlternate=aIsAlternate@entry=0x7fffffff3d97, aForceUpdate=aForceUpdate@entry=false) at /home/fabrice/dev/b2g-inbound/dom/base/nsStyleLinkElement.cpp:420
#13 0x00007ffff2d4f4b0 in nsStyleLinkElement::UpdateStyleSheet (this=0x7fffc3874618, aObserver=0x0, aWillNotify=0x7fffffff3d96, aIsAlternate=0x7fffffff3d97, 
    aForceReload=<optimized out>) at /home/fabrice/dev/b2g-inbound/dom/base/nsStyleLinkElement.cpp:219
#14 0x00007ffff2af2458 in nsHtml5DocumentBuilder::UpdateStyleSheet (this=0x7fffd604c650, aElement=0x7fffc3874580)
    at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5DocumentBuilder.cpp:78
#15 0x00007ffff2b02c54 in nsHtml5TreeBuilder::pop (this=<optimized out>) at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5TreeBuilder.cpp:3904
#16 0x00007ffff2b06fb3 in nsHtml5TreeBuilder::endTag (this=0x7fffdb681030, elementName=0x7fffe5fec300)
    at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5TreeBuilder.cpp:3025
#17 0x00007ffff2b09324 in nsHtml5Tokenizer::emitCurrentTagToken (this=this@entry=0x7fffcd13b860, selfClosing=selfClosing@entry=false, pos=pos@entry=4828)
    at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5Tokenizer.cpp:303
#18 0x00007ffff2b1375d in nsHtml5Tokenizer::stateLoop<nsHtml5SilentPolicy> (this=this@entry=0x7fffcd13b860, state=38, state@entry=0, c=<optimized out>, 
    c@entry=0 u'\000', pos=4828, pos@entry=-1, 
    buf=0x7fffcc9b0008 u"\n<style>\n\n.-host {\n  display: block;\n\n  --gaia-header-button-color:\n    var(--header-button-color,\n    var(--header-color,\n    va---Type <return> to continue, or q <return> to quit---
r(--link-color,\n    inherit)));\n}\n\n/**\n * [hidden]\n */\n\ngaia-header[hid"..., reconsume=<optimized out>, reconsume@entry=false, 
    returnState=returnState@entry=3, endPos=endPos@entry=5000) at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5Tokenizer.cpp:2056
#19 0x00007ffff2b094c3 in nsHtml5Tokenizer::tokenizeBuffer (this=0x7fffcd13b860, buffer=buffer@entry=0x7fffffff40a0)
    at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5Tokenizer.cpp:413
#20 0x00007ffff2b095c7 in nsHtml5StringParser::Tokenize (this=0x7fffd4e9cce0, aSourceBuffer=..., aDocument=<optimized out>, 
    aScriptingEnabledForNoscriptParsing=<optimized out>) at /home/fabrice/dev/b2g-inbound/parser/html/nsHtml5StringParser.cpp:112
#21 0x00007ffff2c500c0 in nsContentUtils::ParseFragmentHTML (aSourceBuffer=..., aTargetNode=0x7fffc3d30cf0, aContextLocalName=0x7fffd6837670, 
    aContextNamespace=3, aQuirks=8, aPreventScriptExecution=8, aPreventScriptExecution@entry=true)
    at /home/fabrice/dev/b2g-inbound/dom/base/nsContentUtils.cpp:4238
#22 0x00007ffff2cb0e64 in mozilla::dom::FragmentOrElement::SetInnerHTMLInternal (this=this@entry=0x7fffc3d30cf0, aInnerHTML=..., aError=...)
    at /home/fabrice/dev/b2g-inbound/dom/base/FragmentOrElement.cpp:2837
#23 0x00007ffff2cba22d in mozilla::dom::ShadowRoot::SetInnerHTML (this=this@entry=0x7fffc3d30cf0, aInnerHTML=..., aError=...)
    at /home/fabrice/dev/b2g-inbound/dom/base/ShadowRoot.cpp:481
#24 0x00007ffff30e8be2 in mozilla::dom::ShadowRootBinding::set_innerHTML (cx=0x7fffdb8a3620, obj=..., self=0x7fffc3d30cf0, args=...)
    at /home/fabrice/dev/builds/obj-b2g-desktop-b2g-inbound/dom/bindings/ShadowRootBinding.cpp:190
#25 0x00007ffff31b9c4c in mozilla::dom::GenericBindingSetter (cx=0x7fffdb8a3620, argc=<optimized out>, vp=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/dom/bindings/BindingUtils.cpp:2398
#26 0x00007ffff42ba788 in CallJSNative (args=..., native=0x7ffff31b9b18 <mozilla::dom::GenericBindingSetter(JSContext*, unsigned int, JS::Value*)>, 
    cx=0x7fffdb8a3620) at /home/fabrice/dev/b2g-inbound/js/src/jscntxtinlines.h:231
#27 js::Invoke (cx=cx@entry=0x7fffdb8a3620, args=..., construct=construct@entry=js::NO_CONSTRUCT) at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:482
#28 0x00007ffff42bc671 in js::Invoke (cx=cx@entry=0x7fffdb8a3620, thisv=..., fval=..., argc=argc@entry=1, argv=argv@entry=0x7fffffff5310, rval=..., 
    rval@entry=...) at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:538
#29 0x00007ffff42bc7ec in js::InvokeGetterOrSetter (cx=cx@entry=0x7fffdb8a3620, obj=0x7fffca9431f0, fval=..., argc=argc@entry=1, argv=argv@entry=0x7fffffff5310, 
    rval=rval@entry=...) at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:611
#30 0x00007ffff42e580f in js::Shape::set (this=<optimized out>, cx=0x7fffdb8a3620, obj=..., obj@entry=..., receiver=..., receiver@entry=..., 
    strict=strict@entry=true, vp=vp@entry=...) at /home/fabrice/dev/b2g-inbound/js/src/vm/Shape-inl.h:93
#31 0x00007ffff42e79e6 in js::baseops::SetPropertyHelper<(js::ExecutionMode)0> (cxArg=0x7fffdb8a3620, obj=..., receiver=..., id=..., qualified=<optimized out>, 
    vp=..., strict=true) at /home/fabrice/dev/b2g-inbound/js/src/vm/NativeObject.cpp:2147
#32 0x00007ffff42afdef in SetPropertyOperation (rval=..., lval=..., pc=<optimized out>, script=..., cx=<optimized out>)
    at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:327
#33 Interpret (cx=0x7fffdb8a3620, state=...) at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:2402
#34 0x00007ffff42ba3d1 in js::RunScript (cx=cx@entry=0x7fffdb8a3620, state=...) at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:432
#35 0x00007ffff42ba656 in js::Invoke (cx=cx@entry=0x7fffdb8a3620, args=..., construct=construct@entry=js::NO_CONSTRUCT)
    at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:501
#36 0x00007ffff42bc671 in js::Invoke (cx=cx@entry=0x7fffdb8a3620, thisv=..., fval=..., argc=0, argv=<optimized out>, rval=...)
    at /home/fabrice/dev/b2g-inbound/js/src/vm/Interpreter.cpp:538
#37 0x00007ffff41b225a in JS::Call (cx=cx@entry=0x7fffdb8a3620, thisv=..., thisv@entry=..., fval=..., fval@entry=..., args=..., rval=..., rval@entry=...)
    at /home/fabrice/dev/b2g-inbound/js/src/jsapi.cpp:5029
#38 0x00007ffff31501f6 in mozilla::dom::LifecycleCreatedCallback::Call (this=this@entry=0x7fffcd05dd00, cx=0x7fffdb8a3620, aThisVal=aThisVal@entry=..., aRv=...)
    at /home/fabrice/dev/builds/obj-b2g-desktop-b2g-inbound/dom/bindings/WebComponentsBinding.cpp:474


We fail because curData is null, and we only assert in debug builds. If we gard against !curData everything *looks* fine, but we have a bunch of errors in the console that my be related:
======================
Timestamp: 11/17/2014 03:23:40 PM
Warning: Property contained reference to invalid variable.  Error in parsing value for 'transform'.  Falling back to 'initial'.
Source File: app://system.gaiamobile.org/style/chrome/chrome.css
Line: 5, Column: 117
Source Code:
 scaleY(var(--rocketbar-scale)) translateY(calc(var(--statusbar-height) * -1))
=======================

David & Cameron, you are the ones that touched this code last. Any insight?
Flags: needinfo?(fabrice)
Flags: needinfo?(dbaron)
Flags: needinfo?(cam)
Fabrice are you working on a revision with the bug 1089463 fix in?
Flags: needinfo?(cam)
(In reply to Cameron McCormack (:heycam) from comment #6)
> Fabrice are you working on a revision with the bug 1089463 fix in?

Yes, I'm on current b2g-inbound that has this fix in https://hg.mozilla.org/integration/b2g-inbound/rev/9b77a97a378b.
Assignee: nobody → cam
Status: NEW → ASSIGNED
Flags: needinfo?(dbaron)
This is what's happening:

1. We have an element E1 that is the root of a subtree that is not in the document and not in a shadow tree.
2. E1's restyle root flag is set due to a previous restyle request and subsequent removal from the document.
3. We have an element E2 that is a descendant of E1, and it has a shadow tree created for it and markup assigned to the ShadowRoot's innerHTML.
4. One of the newly created nodes from the innerHTML assignment is a <style> element.
5. Once the innerHTML assignment is complete, we call nsIPresShell::ReconstructStyleData, which calls AddPendingRestyle for E2 (being the style scope root for the style sheet inside the shadow tree).
6. In AddPendingRestyle we walk up the tree to find an ancestor that has its restyle root flag set, find E1, and expect there to be an entry in the restyle root table for it when there isn't.

So this is similar to bug 1089463, but the fix there doesn't work because E1 didn't get inserted into the document (or a shadow tree of an element in the document) and thus didn't get its restyle flag cleared in Element::BindToTree.

I think we should change the crashing line to null check cur, in case we somehow get the restyle root flag maintenance wrong, but still keep asserting it.  We should clear the flag in UnbindFromTree, rather than BindToTree, and maybe assert that it's still not set in BindToTree.
Attached patch patch (obsolete) — Splinter Review
Attachment #8525708 - Flags: review?(dbaron)
[Tracking Requested - why for this release]: another crash like bug 1089463
Component: DOM: Device Interfaces → CSS Parsing and Computation
Version: unspecified → 35 Branch
The newly added assertion in BindToTree is triggered: https://tbpl.mozilla.org/php/getParsedLog.php?id=53011150&tree=Try
Attachment #8525708 - Flags: review?(dbaron)
> 5. Once the innerHTML assignment is complete, we call nsIPresShell::ReconstructStyleData, 

Er, why, if all of this is not in the composed document?

> We should clear the flag in UnbindFromTree, rather than BindToTree

It's worth looking up why we didn't do it that way to start with, because I seem to recall there being a reason... (though no claims about it being a non-misguided reason).
(In reply to Please do not ask for reviews for a bit [:bz] from comment #13)
> > 5. Once the innerHTML assignment is complete, we call nsIPresShell::ReconstructStyleData, 
> 
> Er, why, if all of this is not in the composed document?

To answer your question literally, because when the style sheet is loaded, it calls ShadowRoot::StyleSheetChanged, which calls nsIPresShell::RecordShadowStyleChange, storing the host element in mChangedScopeStyleRoots, and then PresShell::EndUpdate, which does the ReconstructStyleData call.

Which if any of these things shouldn't be done if the <style> is not in the composed document?

How are <style> elements outside of the document normally handled?
> Which if any of these things shouldn't be done if the <style> is not in the composed
> document?

My instinct is that none of them should be done.

> How are <style> elements outside of the document normally handled?

Normally BindToTree calls UpdateStyleSheetInternal off a scriptrunner, which does DoUpdateStyleSheet, which does:

348   nsCOMPtr<nsIDocument> doc = thisContent->IsInShadowTree() ?
349     thisContent->OwnerDoc() : thisContent->GetUncomposedDoc();
350   if (!doc || !doc->CSSLoader()->GetEnabled()) {
351     return NS_OK;
352   }

Which means that for the non-shadow case we early-return right there for a <style> that's not in the document.

Of course the shadow DOM spec doesn't define behavior here, in the usual way, but what behavior do we actually want?  What does Chrome do?  Note that this is totally script observable via doing .sheet on the <style> element and seeing whether you get null.
In Chrome, output is:

  null
  [object CSSStyleSheet]
  null

so <style>.sheet is null when it's in a shadow tree but not in the composed document.
https://www.w3.org/Bugs/Public/show_bug.cgi?id=27375

I think you're right that the style sheet shouldn't be loaded at that point.
wchen/bz: when I make nsStyleLinkElement::DoUpdateStyleSheet use GetComposedDocument() to determine whether to build the style sheet, I get at least this failure in test_shadowroot_style_multiple_shadow.html:

  https://tbpl.mozilla.org/php/getParsedLog.php?id=53257241&tree=Try

I have a couple of questions:

1. If there is a younger ShadowRoot and an older ShadowRoot, with a <style> element in the older ShadowRoot and with no child nodes of the younger ShadowRoot, should both ShadowRoots' styleSheets arrays then be empty?

  <div></div>
  <script>
    var div = document.querySelector("div");
    var older = div.createShadowRoot();
    older.appendChild(document.createElement("style"));
    var younger = div.createShadowRoot();
    alert(older.styleSheets.length);    // alerts "0"?
    alert(younger.styleSheets.length);  // alerts "0"?
  </script>

2. If the younger ShadowRoot has a <shadow> element, should this just cause the sheet to appear in the older ShadowRoot's styleSheets array?

  <div></div>
  <script>
    var div = document.querySelector("div");
    var older = div.createShadowRoot();
    older.appendChild(document.createElement("style"));
    var younger = div.createShadowRoot();
    younger.appendChild(document.createElement("shadow"));
    alert(older.styleSheets.length);    // alerts "1"?
    alert(younger.styleSheets.length);  // alerts "0"?
  </script>
> should both ShadowRoots' styleSheets arrays then be empty?

Per spec, .styleSheets does:

  On getting, the attribute must return a StyleSheetList sequence containing the shadow
  root style sheets. 

The term "shadow root style sheets" is not defined anywhere.  I filed https://www.w3.org/Bugs/Public/show_bug.cgi?id=27418 on the spec.

This is also the answer to your second question, sort of.  "The spec doesn't say."

What should happen in practice...  My vote would be that this should involve the concept of "in tree" that just transitively goes up the shadow host chain, which would mean that the answer is "yes" for both of your questions.  I don't know whether we have a way to test that predicate in Gecko.
That concept is represented by GetComposedDoc(), I think.

At the moment I think there are three things to fix:

(1) createShadowRoot does not cause nsStyleLinkElement::DoUpdateStyleSheet to be called when it causes an older ShadowRoot's <style> elements to be removed from the composed tree (filed bug 1105027 for that)

(2) nsStyleLinkElement::DoUpdateStyleSheet needs to use GetComposedTree

(3) we should still add the null check to AddPendingRestyle (maybe we should only backport this patch)

and let's forget about changing when the restyle flags get cleared in Element::{BindTo,UnbindFrom}Tree.
> That concept is represented by GetComposedDoc(), I think.

I'm not sure it is.  In particular, nodes in an older shadow tree that are not inserted into a newer one have a GetComposedDoc() that's null, I assume, but I suspect they should load their stylesheets.  Maybe.
(In reply to Please do not ask for reviews for a bit [:bz] from comment #21)
> I'm not sure it is.  In particular, nodes in an older shadow tree that are
> not inserted into a newer one have a GetComposedDoc() that's null, I assume,
> but I suspect they should load their stylesheets.  Maybe.

I was thinking that they shouldn't.  As you say, would be good for the spec to be clear on this.

In the meantime, let's do the null check to avoid the crash in AddPendingrestyle.
Attached patch null check patchSplinter Review
Attachment #8525708 - Attachment is obsolete: true
Attachment #8528722 - Flags: review?(dbaron)
Comment on attachment 8528722 [details] [diff] [review]
null check patch

I don't quite follow why this is needed.  I guess it still assert, so we'll still notice, so r=dbaron.
Attachment #8528722 - Flags: review?(dbaron) → review+
Comment on attachment 8528722 [details] [diff] [review]
null check patch

Approval Request Comment
[Feature/regressing bug #]: 931668
[User impact if declined]: crashes with certain operations on shadow trees and style sheets
[Describe test coverage new/current, TBPL]: just landed on inbound, tested locally
[Risks and why]: low; adding a null check to avoid a crash, which would result at most in not restyling some nodes when we encounter the problem
[String/UUID change made/needed]: N/A
Attachment #8528722 - Flags: approval-mozilla-aurora?
Comment on attachment 8528722 [details] [diff] [review]
null check patch

We merged in between. cf comment #26 for uplift the request.
Attachment #8528722 - Flags: approval-mozilla-aurora? → approval-mozilla-beta?
Attachment #8528722 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
https://hg.mozilla.org/releases/mozilla-beta/rev/798ae4147b62

For tracking purposes, I'm thinking it'd be easier at this point to move any follow-up work to a new bug.
Flags: needinfo?(cam)
Whiteboard: [leave open]
Target Milestone: --- → mozilla36
Clearing the blocking nom for 2.2? as this is already fixed/verified on that branch per the status flag
blocking-b2g: 2.2? → ---
Can this be closed now?
Yep, thanks.
Status: ASSIGNED → RESOLVED
Closed: 9 years ago
Resolution: --- → FIXED
Flags: needinfo?(cam)
You need to log in before you can comment on or make changes to this bug.