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

Windows and elements can exist after their associated pipelines are closed #19170

Open
jdm opened this issue Nov 9, 2017 · 2 comments
Open

Windows and elements can exist after their associated pipelines are closed #19170

jdm opened this issue Nov 9, 2017 · 2 comments

Comments

@jdm
Copy link
Member

@jdm jdm commented Nov 9, 2017

I believe this is the cause of the panics in #18872. We have code that assumes that you can't interact with the pipeline's layout thread after the pipeline is closed, but this minimal reproduction demonstrates otherwise:

<iframe onload="foo()"></iframe>
<script>
function foo() {
var elem = document.querySelector('iframe').contentDocument.documentElement;
document.querySelector('iframe').remove();
setTimeout(function() { elem.getBoundingClientRect(); }, 1000);
}
</script>
called `Result::unwrap()` on an `Err` value: "SendError(..)" (thread ScriptThread PipelineId { namespace_id: PipelineNamespaceId(0), index: PipelineIndex(NonZero(NonZero(1))) }, at src/libcore/result.rs:906)
stack backtrace:
   0:        0x10474ee04 - backtrace::backtrace::trace<closure>
                        at /Users/jdm/src/master-servo/./.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/backtrace/mod.rs:42
   1:        0x104750f9f - backtrace::capture::Backtrace::new::h4a60748a88db7c5e
                        at /Users/jdm/src/master-servo/./.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/capture.rs:64
   2:        0x10004a49e - servo::main::{{closure}}
                        at /Users/jdm/src/master-servo/ports/servo/main.rs:130
   3:        0x1069a9b31 - std::panicking::rust_panic_with_hook::he6f3840a88b909da
                        at src/libstd/panicking.rs:578
   4:        0x1069a9954 - std::panicking::begin_panic<alloc::string::String>
                        at src/libstd/panicking.rs:538
   5:        0x1069a98a2 - std::panicking::begin_panic_fmt::he894f42f5c15aa71
                        at src/libstd/panicking.rs:522
   6:        0x1069a980a - rust_begin_unwind
                        at src/libstd/panicking.rs:498
   7:        0x1069c2553 - core::panicking::panic_fmt::h5a21022eae72748c
                        at src/libcore/panicking.rs:71
   8:        0x1024aa83b - core::result::unwrap_failed<std::sync::mpsc::SendError<script_layout_interface::message::Msg>>
                        at /Users/travis/build/rust-lang/rust/src/libcore/macros.rs:23
   9:        0x102425b36 - core::result::{{impl}}::unwrap<(),std::sync::mpsc::SendError<script_layout_interface::message::Msg>>
                        at /Users/travis/build/rust-lang/rust/src/libcore/result.rs:772
  10:        0x102ad5a79 - script::dom::window::Window::force_reflow::hadb5d71dc15ca38f
                        at /Users/jdm/src/master-servo/components/script/dom/window.rs:1248
  11:        0x102ad71de - script::dom::window::Window::reflow::h9f3484799c87414e
                        at /Users/jdm/src/master-servo/components/script/dom/window.rs:1324
  12:        0x102ad7b1e - script::dom::window::Window::content_box_query::h59b93e8230cb6e29
                        at /Users/jdm/src/master-servo/components/script/dom/window.rs:1374
  13:        0x102a26857 - script::dom::node::Node::bounding_content_box::h2d7b4754244fbbc5
                        at /Users/jdm/src/master-servo/components/script/dom/node.rs:601
  14:        0x102a268ae - script::dom::node::Node::bounding_content_box_or_zero::h329f0480f644362d
                        at /Users/jdm/src/master-servo/components/script/dom/node.rs:606
  15:        0x10298c5fd - _$LT$script..dom..element..Element$u20$as$u20$script..dom..bindings..codegen..Bindings..ElementBinding..ElementBinding..ElementMethods$GT$::GetBoundingClientRect::h16fffbd102f593e0
                        at /Users/jdm/src/master-servo/components/script/dom/element.rs:1794
  16:        0x10118c592 - script::dom::bindings::codegen::Bindings::ElementBinding::ElementBinding::getBoundingClientRect::{{closure}}
                        at /Users/jdm/src/master-servo/target/debug/build/script-28de6b2ec906dfb8/out/Bindings/ElementBinding.rs:2232
  17:        0x100ec5827 - core::ops::function::FnOnce::call_once<closure,()>
                        at /Users/travis/build/rust-lang/rust/src/libcore/ops/function.rs:223
  18:        0x10126269a - std::panic::{{impl}}::call_once<bool,closure>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panic.rs:296
  19:        0x1018f82cc - std::panicking::try::do_call<std::panic::AssertUnwindSafe<closure>,bool>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panicking.rs:480
  20:        0x1069b696c - __rust_maybe_catch_panic
                        at src/libpanic_unwind/lib.rs:99
  21:        0x10184d10d - std::panicking::try<bool,std::panic::AssertUnwindSafe<closure>>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panicking.rs:459
  22:        0x1017131f1 - std::panic::catch_unwind<std::panic::AssertUnwindSafe<closure>,bool>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panic.rs:361
  23:        0x1013adb00 - js::panic::wrap_panic<std::panic::AssertUnwindSafe<closure>,bool>
                        at /Users/jdm/src/master-servo/./.cargo/git/checkouts/rust-mozjs-8611526964119dd6/cdb9570/src/panic.rs:22
  24:        0x10118c534 - script::dom::bindings::codegen::Bindings::ElementBinding::ElementBinding::getBoundingClientRect
                        at /Users/jdm/src/master-servo/target/debug/build/script-28de6b2ec906dfb8/out/Bindings/ElementBinding.rs:2228
  25:        0x1058e7bbb - CallJitMethodOp
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/rust-mozjs-8611526964119dd6/cdb9570/src/jsglue.cpp:516
  26:        0x102927a3b - script::dom::bindings::utils::generic_call
                        at /Users/jdm/src/master-servo/components/script/dom/bindings/utils.rs:450
  27:        0x102927b51 - script::dom::bindings::utils::generic_method
                        at /Users/jdm/src/master-servo/components/script/dom/bindings/utils.rs:458
  28:        0x1062552fc - js::CallJSNative(JSContext*, bool (*)(JSContext*, unsigned int, JS::Value*), JS::CallArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/jscntxtinlines.h:232
  29:        0x10625506d - js::InternalCallOrConstruct(JSContext*, JS::CallArgs const&, js::MaybeConstruct)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:453
  30:        0x106255676 - InternalCall(JSContext*, js::AnyInvokeArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:498
  31:        0x106255705 - js::Call(JSContext*, JS::Handle<JS::Value>, JS::Handle<JS::Value>, js::AnyInvokeArgs const&, JS::MutableHandle<JS::Value>)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:517
  32:        0x1061912af - js::Wrapper::call(JSContext*, JS::Handle<JSObject*>, JS::CallArgs const&) const
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/proxy/Wrapper.cpp:165
  33:        0x106178ba4 - js::CrossCompartmentWrapper::call(JSContext*, JS::Handle<JSObject*>, JS::CallArgs const&) const
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/proxy/CrossCompartmentWrapper.cpp:329
  34:        0x1061862b5 - js::Proxy::call(JSContext*, JS::Handle<JSObject*>, JS::CallArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/proxy/Proxy.cpp:401
  35:        0x106187b32 - js::proxy_Call(JSContext*, unsigned int, JS::Value*)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/proxy/Proxy.cpp:689
  36:        0x1062552fc - js::CallJSNative(JSContext*, bool (*)(JSContext*, unsigned int, JS::Value*), JS::CallArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/jscntxtinlines.h:232
  37:        0x106254f38 - js::InternalCallOrConstruct(JSContext*, JS::CallArgs const&, js::MaybeConstruct)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:441
  38:        0x106255676 - InternalCall(JSContext*, js::AnyInvokeArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:498
  39:        0x10625547c - js::CallFromStack(JSContext*, JS::CallArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:504
  40:        0x10624a4d2 - Interpret(JSContext*, js::RunState&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:2873
  41:        0x10623f968 - js::RunScript(JSContext*, js::RunState&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:399
  42:        0x10625513a - js::InternalCallOrConstruct(JSContext*, JS::CallArgs const&, js::MaybeConstruct)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:471
  43:        0x106255676 - InternalCall(JSContext*, js::AnyInvokeArgs const&)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:498
  44:        0x106255705 - js::Call(JSContext*, JS::Handle<JS::Value>, JS::Handle<JS::Value>, js::AnyInvokeArgs const&, JS::MutableHandle<JS::Value>)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/vm/Interpreter.cpp:517
  45:        0x105f8501b - JS_CallFunctionValue(JSContext*, JS::Handle<JSObject*>, JS::Handle<JS::Value>, JS::HandleValueArray const&, JS::MutableHandle<JS::Value>)
                        at /Users/jdm/src/master-servo/.cargo/git/checkouts/mozjs-fa11ffc7d4f1cc2d/424067c/mozjs/js/src/jsapi.cpp:2781
  46:        0x102d2c690 - script::dom::bindings::codegen::Bindings::FunctionBinding::Function::Call::h1c0823dade6bfbce
                        at /Users/jdm/src/master-servo/target/debug/build/script-28de6b2ec906dfb8/out/Bindings/FunctionBinding.rs:295
  47:        0x102d2bb17 - script::dom::bindings::codegen::Bindings::FunctionBinding::{{impl}}::Call_<script::dom::globalscope::GlobalScope>
                        at /Users/jdm/src/master-servo/target/debug/build/script-28de6b2ec906dfb8/out/Bindings/FunctionBinding.rs:266
  48:        0x102b17aa5 - script::timers::{{impl}}::invoke<script::dom::globalscope::GlobalScope>
                        at /Users/jdm/src/master-servo/components/script/timers.rs:504
  49:        0x102b13b71 - script::timers::{{impl}}::invoke<script::dom::globalscope::GlobalScope>
                        at /Users/jdm/src/master-servo/components/script/timers.rs:81
  50:        0x102b151d6 - script::timers::{{impl}}::fire_timer
                        at /Users/jdm/src/master-servo/components/script/timers.rs:207
  51:        0x1029adfbf - script::dom::globalscope::GlobalScope::fire_timer::h358990d5adc40015
                        at /Users/jdm/src/master-servo/components/script/dom/globalscope.rs:456
  52:        0x102ad9bf1 - script::dom::window::Window::handle_fire_timer::h533568754c2d384b
                        at /Users/jdm/src/master-servo/components/script/dom/window.rs:1549
  53:        0x101f39b7b - script::script_thread::{{impl}}::handle_timer_event
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:1383
  54:        0x101f33bb0 - script::script_thread::{{impl}}::handle_msgs::{{closure}}
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:1073
  55:        0x101f3667b - script::script_thread::{{impl}}::profile_event<closure,core::option::Option<bool>>
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:1245
  56:        0x101f31c4b - script::script_thread::{{impl}}::handle_msgs
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:1065
  57:        0x101f2fd50 - script::script_thread::ScriptThread::start::h695d8553c401e301
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:897
  58:        0x101f2b0a4 - script::script_thread::{{impl}}::create::{{closure}}::{{closure}}
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:578
  59:        0x1021a116b - profile_traits::mem::{{impl}}::run_with_memory_reporting<closure,fn(profile_traits::mem::ReportsChan) -> script::script_runtime::CommonScriptMsg,script::script_runtime::CommonScriptMsg,std::sync::mpsc::Sender<script::script_thread::MainThreadScriptMsg>>
                        at /Users/jdm/src/master-servo/components/profile_traits/mem.rs:63
  60:        0x101f2b689 - script::script_thread::{{impl}}::create::{{closure}}
                        at /Users/jdm/src/master-servo/components/script/script_thread.rs:577
  61:        0x1022c3c6a - std::sys_common::backtrace::__rust_begin_short_backtrace<closure,()>
                        at /Users/travis/build/rust-lang/rust/src/libstd/sys_common/backtrace.rs:134
  62:        0x102331dd3 - std::thread::{{impl}}::spawn::{{closure}}::{{closure}}<closure,()>
                        at /Users/travis/build/rust-lang/rust/src/libstd/thread/mod.rs:400
  63:        0x1012ba9ca - std::panic::{{impl}}::call_once<(),closure>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panic.rs:296
  64:        0x1018c6902 - std::panicking::try::do_call<std::panic::AssertUnwindSafe<closure>,()>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panicking.rs:480
  65:        0x1069b696c - __rust_maybe_catch_panic
                        at src/libpanic_unwind/lib.rs:99
  66:        0x1018543dc - std::panicking::try<(),std::panic::AssertUnwindSafe<closure>>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panicking.rs:459
  67:        0x10170ec75 - std::panic::catch_unwind<std::panic::AssertUnwindSafe<closure>,()>
                        at /Users/travis/build/rust-lang/rust/src/libstd/panic.rs:361
  68:        0x102331b5b - std::thread::{{impl}}::spawn::{{closure}}<closure,()>
                        at /Users/travis/build/rust-lang/rust/src/libstd/thread/mod.rs:399
  69:        0x1024b0783 - alloc::boxed::{{impl}}::call_box<(),closure>
                        at /Users/travis/build/rust-lang/rust/src/liballoc/boxed.rs:762
  70:        0x1069a890b - std::sys::imp::thread::{{impl}}::new::thread_start
                        at src/libstd/sys_common/thread.rs:24
  71:     0x7fffd9f7f93a - _pthread_body
  72:     0x7fffd9f7f886 - _pthread_start
@jdm
Copy link
Member Author

@jdm jdm commented Nov 9, 2017

This is a super general problem that is not just limited to GetBoundingClientRect.

@emilio
Copy link
Member

@emilio emilio commented Nov 10, 2017

Ouch, indeed, basically anything that tries to communicate with layout should be able to handle failure...

There's stuff that's not easy here, and it's not clear how you'd handle failure in some cases (like getComputedStyle). Returning null for example would cause stuff like: https://bugzilla.mozilla.org/show_bug.cgi?id=548397

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.

None yet
2 participants
You can’t perform that action at this time.