Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Panic when using HTMLLinkElement.relList after setting HTMLLinkElement.rel #12799

Closed
jdm opened this issue Aug 10, 2016 · 11 comments
Closed

Panic when using HTMLLinkElement.relList after setting HTMLLinkElement.rel #12799

jdm opened this issue Aug 10, 2016 · 11 comments

Comments

@jdm
Copy link
Member

@jdm jdm commented Aug 10, 2016

<script>
var l = document.createElement('link');
l.rel = "noreferrer";
l.relList.add("stylesheet");
</script>

yields

ERROR:servo: Tokens not found
Process 72828 stopped
* thread #21: tid = 0x34c99d, 0x0000000104b7c930 servo`rust_panic, stop reason = breakpoint 1.1
    frame #0: 0x0000000104b7c930 servo`rust_panic
servo`rust_panic:
-> 0x104b7c930:  pushq  %rbp
   0x104b7c931:  movq   %rsp, %rbp
   0x104b7c934:  subq   $0x90, %rsp
   0x104b7c93b:  callq  0x104b7d770               ; __rust_start_panic
(lldb) bt
error: need to add support for DW_TAG_base_type '()' encoded with DW_ATE = 0x7, bit_size = 0
* thread #21: tid = 0x34c99d, 0x0000000104b7c930 servo`rust_panic, stop reason = breakpoint 1.1
  * frame #0: 0x0000000104b7c930 servo`rust_panic
    frame #1: 0x0000000104b7c89d servo`std::panicking::rust_panic_with_hook::h105c3d42fcd2fb5e + 413
    frame #2: 0x0000000103bbcd48 servo`{{inlined-root}}::begin_panic<&str>(msg=&str at 0x000000011d5ead70, file_line=0x0000000105fe4b40) + 120 at panicking.rs:328
    frame #3: 0x0000000103d0d4e7 servo`style::attr::{{impl}}::as_tokens(self=0x000000011e63b118) + 119 at <std macros>:3
    frame #4: 0x00000001024b4484 servo`script::dom::element::{{impl}}::get_tokenlist_attribute::{{closure}}(attr=Root<script::dom::attr::Attr> at 0x000000011d5eae98) + 180 at element.rs:1214
    frame #5: 0x000000010149f818 servo`{{inlined-root}}::map<script::dom::bindings::js::Root<script::dom::attr::Attr>,collections::vec::Vec<string_cache::atom::Atom>,closure>(self=Option<script::dom::bindings::js::Root<script::dom::attr::Attr>> at 0x000000011d5eaf38, f=closure at 0x000000011d5eaf30) + 136 at option.rs:386
    frame #6: 0x00000001022e178e servo`script::dom::element::{{impl}}::get_tokenlist_attribute(self=0x000000011e664300, local_name=0x000000011e61f270) + 110 at element.rs:1213
    frame #7: 0x00000001022d6f1e servo`script::dom::domtokenlist::{{impl}}::Add(self=0x000000011e61f260, tokens=Vec<script::dom::bindings::str::DOMString> at 0x000000011d5eb208) + 158 at domtokenlist.rs:86
    frame #8: 0x00000001027889e3 servo`script::dom::bindings::codegen::Bindings::DOMTokenListBinding::add::{{closure}} + 1139 at DOMTokenListBinding.rs:275
    frame #9: 0x0000000102788c29 servo`extern$u20$$u22$rust.call$u22$$u20$fn$LP$$u5b$closure$SP$$u2f$Users$u2f$jdm$u2f$src$u2f$servo$u2f$target$u2f$debug$u2f$build$u2f$script.b33cff3c53b753bb$u2f$out$u2f$Bindings$u2f$DOMTokenListBinding.rs.260.55.$u20$286.22$u20$this.$RF$$BP$const$u20$dom..domtokenlist..DOMTokenList$C$$u20$args.$RF$$BP$const$u20$js..jsapi..JSJitMethodCallArgs$C$$u20$cx.$RF$$BP$mut$u20$js..jsapi..JSContext$u5d$$C$$u20$$LP$$RP$$RP$$u20$.$GT$$u20$bool::once_shim.78536::h7335bb579241bd83 + 9
    frame #10: 0x0000000101e14983 servo`{{inlined-root}}::call_once<bool,closure>(self=AssertUnwindSafe<closure> at 0x000000011d5eb528, _args=<unavailable>) + 67 at panic.rs:256
    frame #11: 0x000000010252d264 servo`std::panicking::try::_$u7b$$u7b$closure$u7d$$u7d$::_$u7b$$u7b$closure$u7d$$u7d$::h9feb3384412ce64d + 68
    frame #12: 0x0000000101716d25 servo`{{inlined-root}}::call<closure>(f=0x000000011d5eb668) + 21 at panicking.rs:272
    frame #13: 0x0000000104b7d71b servo`__rust_maybe_catch_panic + 27
    frame #14: 0x000000010252d1ce servo`std::panicking::try::_$u7b$$u7b$closure$u7d$$u7d$::h3c9306b1b63cc624 + 158
    frame #15: 0x00000001017ddca0 servo`{{inlined-root}}::with<core::cell::Cell<usize>,closure,core::result::Result<(self=0x00000001060b9760, f=closure at 0x000000011d5eb708), Box<Any>>> + 208 at local.rs:245
    frame #16: 0x0000000101670444 servo`{{inlined-root}}::try<bool,std::panic::AssertUnwindSafe<closure>>(f=AssertUnwindSafe<closure> at 0x000000011d5eb7c8) + 132 at panicking.rs:235
    frame #17: 0x000000010160486a servo`{{inlined-root}}::catch_unwind<std::panic::AssertUnwindSafe<closure>,bool>(f=AssertUnwindSafe<closure> at 0x000000011d5eb818) + 74 at panic.rs:312
    frame #18: 0x0000000102001208 servo`script::dom::bindings::codegen::Bindings::DOMTokenListBinding::add(cx=0x000000011113cc00, _obj=Handle<*mut js::jsapi::JSObject> at 0x000000011d5eb8f0, this=0x000000011e61f260, args=0x000000011d5eb940) + 72 at DOMTokenListBinding.rs:260
    frame #19: 0x0000000102ba9e3c servo`CallJitMethodOp(info=0x0000000105e84ea8, cx=0x000000011113cc00, thisObj=JS::HandleObject at 0x000000011d5eb998, specializedThis=0x000000011e61f260, argc=1, vp=0x000000011414c690) + 124 at jsglue.cpp:472
    frame #20: 0x0000000101f592fd servo`script::dom::bindings::utils::generic_call(cx=0x000000011113cc00, argc=1, vp=0x000000011414c690, is_lenient=false, call=0x0000000102ba9dc0) + 3325 at utils.rs:484
    frame #21: 0x0000000101f5937c servo`script::dom::bindings::utils::generic_method(cx=0x000000011113cc00, argc=1, vp=0x000000011414c690) + 44 at utils.rs:492
    frame #22: 0x00000001035a355b servo`js::CallJSNative(cx=0x000000011113cc00, native=0x0000000101f59350, args=0x000000011d5ee1a8)(JSContext*, unsigned int, JS::Value*), JS::CallArgs const&) + 187 at jscntxtinlines.h:232
    frame #23: 0x000000010357daf3 servo`js::InternalCallOrConstruct(cx=0x000000011113cc00, args=0x000000011d5ee1a8, construct=NO_CONSTRUCT) + 1091 at Interpreter.cpp:453
    frame #24: 0x000000010357dee8 servo`InternalCall(cx=0x000000011113cc00, args=0x000000011d5ee1a8) + 504 at Interpreter.cpp:498
    frame #25: 0x000000010357dcdd servo`js::CallFromStack(cx=0x000000011113cc00, args=0x000000011d5ee1a8) + 29 at Interpreter.cpp:504
    frame #26: 0x000000010357284f servo`Interpret(cx=0x000000011113cc00, state=0x000000011d5ef2b0) + 44687 at Interpreter.cpp:2873
    frame #27: 0x00000001035678bf servo`js::RunScript(cx=0x000000011113cc00, state=0x000000011d5ef2b0) + 799 at Interpreter.cpp:399
    frame #28: 0x000000010357ef08 servo`js::ExecuteKernel(cx=0x000000011113cc00, script=JS::HandleScript at 0x000000011d5ef370, scopeChainArg=0x000000011d104070, newTargetValue=0x000000011d5ef3c0, evalInFrame=AbstractFramePtr at 0x000000011d5ef368, result=0x000000011d5f00b0) + 776 at Interpreter.cpp:679
    frame #29: 0x000000010357f29d servo`js::Execute(cx=0x000000011113cc00, script=JS::HandleScript at 0x000000011d5ef418, scopeChainArg=0x000000011d104070, rval=0x000000011d5f00b0) + 813 at Interpreter.cpp:711
    frame #30: 0x000000010326ed1e servo`Evaluate(cx=0x000000011113cc00, scope=JS::HandleObject at 0x000000011d5ef550, staticScope=Handle<js::StaticScope *> at 0x000000011d5ef548, optionsArg=0x000000010fc79460, srcBuf=0x000000011d5ef6e0, rval=JS::MutableHandleValue at 0x000000011d5ef540) + 1182 at jsapi.cpp:4406
    frame #31: 0x000000010326efa7 servo`Evaluate(cx=0x000000011113cc00, optionsArg=0x000000010fc79460, chars=0x000000011e6670c0, length=92, rval=JS::MutableHandleValue at 0x000000011d5ef718) + 263 at jsapi.cpp:4443
    frame #32: 0x000000010326ee8d servo`JS::Evaluate(cx=0x000000011113cc00, optionsArg=0x000000010fc79460, chars=0x000000011e6670c0, length=92, rval=JS::MutableHandleValue at 0x000000011d5ef758) + 61 at jsapi.cpp:4501
    frame #33: 0x00000001024a71ce servo`script::dom::window::{{impl}}::evaluate_script_on_global_with_result::{{closure}}<script::dom::window::Window> + 878 at window.rs:951
    frame #34: 0x000000010135d24f servo`{{inlined-root}}::profile<(category=ScriptEvaluate, meta=Option<profile_traits::time::TimerMetadata> at 0x000000011d5efbc8, profiler_chan=ProfilerChan at 0x000000011d5efbc0, callback=closure at 0x000000011d5efb98),closure> + 239 at time.rs:108
    frame #35: 0x00000001024195a0 servo`script::dom::window::{{impl}}::evaluate_script_on_global_with_result<script::dom::window::Window>(self=0x000000011e638800, code=&str at 0x000000011d5efd90, filename=&str at 0x000000011d5efd80, rval=MutableHandle<js::jsapi::Value> at 0x000000011d5efd78) + 720 at window.rs:938
    frame #36: 0x000000010236996b servo`script::dom::htmlscriptelement::{{impl}}::execute(self=0x000000011e636400) + 3515 at htmlscriptelement.rs:467
    frame #37: 0x00000001023689d9 servo`script::dom::htmlscriptelement::{{impl}}::prepare(self=0x000000011e636400) + 7785 at htmlscriptelement.rs:403
    frame #38: 0x0000000102446948 servo`script::parse::html::{{impl}}::complete_script(self=0x000000011e642338, node=JS<script::dom::node::Node> at 0x000000011d5f1258) + 72 at html.rs:159
    frame #39: 0x0000000101330325 servo`{{inlined-root}}::step<script::dom::bindings::js::JS<script::dom::node::Node>,script::dom::servohtmlparser::Sink>(self=0x000000011e642330, mode=Text, token=Token at 0x000000011d5f7d78) + 55525 at rules.expanded.rs:1461
    frame #40: 0x0000000101cf9ea5 servo`{{inlined-root}}::process_to_completion<script::dom::bindings::js::JS<script::dom::node::Node>,script::dom::servohtmlparser::Sink>(self=0x000000011e642330, token=Token at 0x000000011d5f8580) + 613 at mod.rs:320
    frame #41: 0x000000010131c5ad servo`{{inlined-root}}::process_token<script::dom::bindings::js::JS<script::dom::node::Node>,script::dom::servohtmlparser::Sink>(self=0x000000011e642330, token=Token at 0x000000011d5f8a30) + 3405 at mod.rs:418
    frame #42: 0x0000000101c1a2be servo`{{inlined-root}}::process_token<html5ever::tree_builder::TreeBuilder<script::dom::bindings::js::JS<script::dom::node::Node>, script::dom::servohtmlparser::Sink>>(self=0x000000011e642310, token=Token at 0x000000011d5f8b90) + 654 at mod.rs:233
    frame #43: 0x0000000101c1b0ca servo`{{inlined-root}}::emit_current_tag<html5ever::tree_builder::TreeBuilder<script::dom::bindings::js::JS<script::dom::node::Node>, script::dom::servohtmlparser::Sink>>(self=0x000000011e642310) + 1162 at mod.rs:392
    frame #44: 0x0000000101c20fdb servo`{{inlined-root}}::step<html5ever::tree_builder::TreeBuilder<script::dom::bindings::js::JS<script::dom::node::Node>, script::dom::servohtmlparser::Sink>>(self=0x000000011e642310) + 15867 at mod.rs:795
    frame #45: 0x0000000101c1cf94 servo`{{inlined-root}}::run<html5ever::tree_builder::TreeBuilder<script::dom::bindings::js::JS<script::dom::node::Node>, script::dom::servohtmlparser::Sink>>(self=0x000000011e642310) + 628 at mod.rs:334
    frame #46: 0x0000000101c1d14d servo`{{inlined-root}}::feed<html5ever::tree_builder::TreeBuilder<script::dom::bindings::js::JS<script::dom::node::Node>, script::dom::servohtmlparser::Sink>>(self=0x000000011e642310, input=Tendril<tendril::fmt::UTF8, tendril::tendril::NonAtomic> at 0x000000011d5fa9a8) + 413 at mod.rs:221
    frame #47: 0x00000001023c9c18 servo`script::dom::servohtmlparser::{{impl}}::do_parse_sync(self=0x000000011e642300) + 504 at servohtmlparser.rs:363
    frame #48: 0x00000001024a7d08 servo`script::dom::servohtmlparser::{{impl}}::parse_sync::{{closure}} + 40 at servohtmlparser.rs:352
    frame #49: 0x000000010135dc10 servo`{{inlined-root}}::profile<(category=ScriptParseHTML, meta=Option<profile_traits::time::TimerMetadata> at 0x000000011d5fac08, profiler_chan=ProfilerChan at 0x000000011d5fac00, callback=closure at 0x000000011d5fabf0),closure> + 176 at time.rs:108
    frame #50: 0x00000001023c99f7 servo`script::dom::servohtmlparser::{{impl}}::parse_sync(self=0x000000011e642300) + 423 at servohtmlparser.rs:349
    frame #51: 0x00000001023c82d3 servo`script::dom::servohtmlparser::{{impl}}::parse_chunk(self=0x000000011e642300, input=String at 0x000000011d5fadd8) + 371 at servohtmlparser.rs:237
    frame #52: 0x000000010244ae7c servo`script::parse::{{impl}}::parse_chunk(self=0x000000011d5faf40, input=String at 0x000000011d5fae98) + 172 at mod.rs:109
    frame #53: 0x00000001023c74ff servo`script::dom::servohtmlparser::{{impl}}::data_available(self=0x000000011e63b020, payload=Vec<u8> at 0x000000011d5fb008) + 639 at servohtmlparser.rs:177
    frame #54: 0x0000000101d2bd50 servo`{{inlined-root}}::process<script::dom::servohtmlparser::ParserContext>(self=ResponseAction at 0x000000011d5fb300, listener=0x000000011e63b020) + 352 at lib.rs:261
    frame #55: 0x00000001024446bb servo`script::network_listener::{{impl}}::handler<net_traits::ResponseAction,script::dom::servohtmlparser::ParserContext>(self=0x0000000119a15700) + 459 at network_listener.rs:71
    frame #56: 0x000000010245a7ff servo`script::script_thread::{{impl}}::handle_msg_from_script(self=0x000000011d5ff318, msg=MainThreadScriptMsg at 0x000000011d5fbb08) + 1327 at script_thread.rs:954
    frame #57: 0x00000001024a77f5 servo`script::script_thread::{{impl}}::handle_msgs::{{closure}} + 405 at script_thread.rs:786
    frame #58: 0x00000001024589e6 servo`script::script_thread::{{impl}}::profile_event<closure,core::option::Option<bool>>(self=0x000000011d5ff318, category=NetworkEvent, f=closure at 0x000000011d5fc490) + 1062 at script_thread.rs:880
    frame #59: 0x0000000102457744 servo`script::script_thread::{{impl}}::handle_msgs(self=0x000000011d5ff318) + 7396 at script_thread.rs:778
    frame #60: 0x0000000102455a4d servo`script::script_thread::{{impl}}::start(self=0x000000011d5ff318) + 29 at script_thread.rs:632
    frame #61: 0x00000001024a662c servo`script::script_thread::{{impl}}::create::{{closure}}::{{closure}} + 44 at script_thread.rs:474
    frame #62: 0x000000010135c882 servo`{{inlined-root}}::run_with_memory_reporting<closure,fn(self=0x000000011d5ff560, f=closure at 0x000000011d5fed60, reporter_name=String at 0x000000011d5fed40, channel_for_reporter=Sender<script::script_thread::MainThreadScriptMsg> at 0x000000011d5fed28, msg=0x0000000000000020) -> script::script_runtime::CommonScriptMsg,script::script_runtime::CommonScriptMsg,std::sync::mpsc::Sender<script::script_thread::MainThreadScriptMsg>> + 690 at mem.rs:59
    frame #63: 0x00000001027995c4 servo`script::script_thread::{{impl}}::create::{{closure}} + 1764 at script_thread.rs:473
    frame #64: 0x0000000101e16768 servo`{{inlined-root}}::call_once<(self=AssertUnwindSafe<closure> at 0x000000011d5ff848, _args=<unavailable>),closure> + 136 at panic.rs:256
    frame #65: 0x00000001025abc2c servo`std::panicking::try::_$u7b$$u7b$closure$u7d$$u7d$::_$u7b$$u7b$closure$u7d$$u7d$::ha95a03972526c7f7 + 92
    frame #66: 0x000000010172db45 servo`{{inlined-root}}::call<closure>(f=0x000000011d5fff58) + 21 at panicking.rs:272
    frame #67: 0x0000000104b7d71b servo`__rust_maybe_catch_panic + 27
    frame #68: 0x00000001025abb7e servo`std::panicking::try::_$u7b$$u7b$closure$u7d$$u7d$::he9a51e1f1d836034 + 158
    frame #69: 0x000000010179f910 servo`{{inlined-root}}::with<core::cell::Cell<usize>,closure,core::result::Result<(self=0x00000001060b9760, f=closure at 0x000000011d5ffff8), Box<Any>>> + 208 at local.rs:245
    frame #70: 0x00000001016c6480 servo`{{inlined-root}}::try<(f=AssertUnwindSafe<closure> at 0x000000011d6002b8),std::panic::AssertUnwindSafe<closure>> + 192 at panicking.rs:235
    frame #71: 0x000000010160352f servo`{{inlined-root}}::catch_unwind<std::panic::AssertUnwindSafe<closure>,(f=AssertUnwindSafe<closure> at 0x000000011d600718)> + 143 at panic.rs:312
    frame #72: 0x00000001024c867d servo`std::thread::Builder::spawn::_$u7b$$u7b$closure$u7d$$u7d$::h4b7df7e534520368 + 349
    frame #73: 0x0000000101bf58f8 servo`{{inlined-root}}::call_box<(self=0x000000011bc57000, args=<unavailable>),closure> + 104 at boxed.rs:587
    frame #74: 0x0000000104b7b4a9 servo`std::sys::thread::Thread::new::thread_start::h8f3bd45211e9f5ea + 57
    frame #75: 0x00007fff945f2899 libsystem_pthread.dylib`_pthread_body + 138
    frame #76: 0x00007fff945f272a libsystem_pthread.dylib`_pthread_start + 137
    frame #77: 0x00007fff945f6fc9 libsystem_pthread.dylib`thread_start + 13
@Ms2ger
Copy link
Contributor

@Ms2ger Ms2ger commented Aug 10, 2016

The buggy code is

    // https://html.spec.whatwg.org/multipage/#dom-link-rel
    make_setter!(SetRel, "rel");

in htmllinkelement.rs. It should be more like

    // https://dom.spec.whatwg.org/#dom-element-classname
    fn SetClassName(&self, class: DOMString) {
        self.set_tokenlist_attribute(&atom!("class"), class);
    }
@Ms2ger Ms2ger added the E-easy label Aug 10, 2016
@highfive
Copy link

@highfive highfive commented Aug 10, 2016

Please make a comment here if you intend to work on this issue. Thank you!

@cynicaldevil
Copy link
Contributor

@cynicaldevil cynicaldevil commented Aug 12, 2016

@Ms2ger What about this method here?

@KiChjang
Copy link
Member

@KiChjang KiChjang commented Aug 12, 2016

@cynicaldevil The make_setter macro expands and defines the SetRel function that you linked.

@cynicaldevil
Copy link
Contributor

@cynicaldevil cynicaldevil commented Aug 12, 2016

@KiChjang yeah I thought about that after I wrote that comment....anyway, how am I supposed to do this? I looked up SetClassName and found that it belonged to the ElementMethods trait, which currently is not being implemented by htmlLinkElement.

@jdm
Copy link
Member Author

@jdm jdm commented Aug 12, 2016

@cynicaldevil HTMLLinkElement "inherits" from Element, so you can call some_link_element.upcast::<Element>() and then invoke methods from ElementMethods.

@jdm
Copy link
Member Author

@jdm jdm commented Aug 12, 2016

@KiChjang
Copy link
Member

@KiChjang KiChjang commented Aug 12, 2016

@cynicaldevil I'm going to assume that you're currently working on this.

@KiChjang KiChjang added the C-assigned label Aug 12, 2016
@cynicaldevil
Copy link
Contributor

@cynicaldevil cynicaldevil commented Aug 12, 2016

@KiChjang yes, that's right.
@jdm Thanks, I will look into it.

@KiChjang
Copy link
Member

@KiChjang KiChjang commented Sep 11, 2016

@cynicaldevil Any problems so far? Any blockers, questions?

@cynicaldevil
Copy link
Contributor

@cynicaldevil cynicaldevil commented Sep 11, 2016

@KiChjang I'm sorry I completely forgot about this, I will take a look and get back to you if I have any questions in a day or two :)

bors-servo added a commit that referenced this issue Sep 19, 2016
Correctly gets and sets rel content attributes in linkelement

<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #12799 .

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13311)
<!-- Reviewable:end -->
bors-servo added a commit that referenced this issue Sep 22, 2016
Correctly gets and sets rel content attributes in linkelement

<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #12799 .

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13311)
<!-- Reviewable:end -->
bors-servo added a commit that referenced this issue Sep 23, 2016
Correctly gets and sets rel content attributes in linkelement

<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #12799 .

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13311)
<!-- Reviewable:end -->
@jdm jdm mentioned this issue Sep 23, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

5 participants
You can’t perform that action at this time.