This is actually a backport of the following Blink change https://src.chromium.org/viewvc/blink?view=rev&revision=185426. New scope types introduced by ES6 features are not yes supported by DevTools and should just be ignored by the debugger. ScriptScope that caused troubles in this particular case was supported in V8 debugger quite recently (https://codereview.chromium.org/726643002). This fixes following crash on pause in Sky: #0 0x00007f8a39cffe1b in blink::TypeBuilder::Debugger::Scope::Type::assertCorrectValue (value=0xd98ce760450) at gen/sky/core/InspectorTypeBuilder.cpp:596 #1 0x00007f8a39d00072 in blink::TypeBuilder::Debugger::Scope::assertCorrectValue (value=0xd98ce658898) at gen/sky/core/InspectorTypeBuilder.cpp:610 #2 0x00007f8a39d033c5 in blink::TypeBuilder::StructItemTraits::assertCorrectValue<blink::TypeBuilder::Debugger::Scope> (value=0xd98ce658898) at gen/sky/core/InspectorTypeBuilder.h:160 #3 0x00007f8a39d02f71 in blink::TypeBuilder::Array<blink::TypeBuilder::Debugger::Scope>::assertCorrectValue (value=0xd98ce60af00) at gen/sky/core/InspectorTypeBuilder.h:139 #4 0x00007f8a39cffaaf in blink::TypeBuilder::Debugger::CallFrame::assertCorrectValue (value=0xd98ce658420) at gen/sky/core/InspectorTypeBuilder.cpp:569 #5 0x00007f8a3a753435 in blink::TypeBuilder::StructItemTraits::assertCorrectValue<blink::TypeBuilder::Debugger::CallFrame> (value=0xd98ce658420) at gen/sky/core/InspectorTypeBuilder.h:160 #6 0x00007f8a3a753371 in blink::TypeBuilder::Array<blink::TypeBuilder::Debugger::CallFrame>::assertCorrectValue (value=0xd98ce60af50) at gen/sky/core/InspectorTypeBuilder.h:139 #7 0x00007f8a3a752fa6 in blink::TypeBuilder::Array<blink::TypeBuilder::Debugger::CallFrame>::runtimeCast (value=...) at gen/sky/core/InspectorTypeBuilder.h:121 #8 0x00007f8a3a751e8c in blink::InjectedScript::wrapCallFrames (this=0x7f8a5560d988, callFrames=..., asyncOrdinal=0) at ../../sky/engine/core/inspector/InjectedScript.cpp:261 #9 0x00007f8a3a765350 in blink::InspectorDebuggerAgent::currentCallFrames (this=0xd98ce689410) at ../../sky/engine/core/inspector/InspectorDebuggerAgent.cpp:1149 #10 0x00007f8a3a76ae84 in blink::InspectorDebuggerAgent::didPause (this=0xd98ce689410, scriptState=0xd98ce670170, callFrames=..., exception=..., hitBreakpoints=...) at ../../sky/engine/core/inspector/InspectorDebuggerAgent.cpp:1354 #11 0x00007f8a3a76b0b7 in non-virtual thunk to blink::InspectorDebuggerAgent::didPause(blink::ScriptState*, blink::ScriptValue const&, blink::ScriptValue const&, WTF::Vector<WTF::String, 0ul, WTF::DefaultAllocator> const&) () at ../../sky/engine/core/inspector/InspectorDebuggerAgent.cpp:1368 #12 0x00007f8a399dae78 in blink::ScriptDebugServer::handleProgramBreak (this=0x7f8a441c5070, pausedScriptState=0xd98ce670170, executionState=..., exception=..., hitBreakpointNumbers=...) at ../../sky/engine/bindings/core/v8/ScriptDebugServer.cpp:449 #13 0x00007f8a399dbaa8 in blink::ScriptDebugServer::handleV8DebugEvent (this=0x7f8a441c5070, eventDetails=...) at ../../sky/engine/bindings/core/v8/ScriptDebugServer.cpp:519 #14 0x00007f8a399db064 in blink::ScriptDebugServer::v8DebugEventCallback (eventDetails=...) at ../../sky/engine/bindings/core/v8/ScriptDebugServer.cpp:470 #15 0x00007f8a3937bc93 in v8::internal::Debug::CallEventCallback (this=0x7f8a44015510, event=v8::Break, exec_state=..., event_data=..., client_data=0x0) at ../../v8/src/debug.cc:2826 #16 0x00007f8a3937a5af in v8::internal::Debug::ProcessDebugEvent (this=0x7f8a44015510, event=v8::Break, event_data=..., auto_continue=false) at ../../v8/src/debug.cc:2793 #17 0x00007f8a39375589 in v8::internal::Debug::OnDebugBreak (this=0x7f8a44015510, break_points_hit=..., auto_continue=false) at ../../v8/src/debug.cc:2657 #18 0x00007f8a39374132 in v8::internal::Debug::Break (this=0x7f8a44015510, args=..., frame=0x7f8a5560e958) at ../../v8/src/debug.cc:939 #19 0x00007f8a393756d0 in v8::internal::__RT_impl_Debug_Break (args=..., isolate=0x7f8a44007380) at ../../v8/src/debug.cc:982 #20 0x00007f8a3937562e in v8::internal::Debug_Break (args_length=0, args_object=0x7f8a5560eb80, isolate=0x7f8a44007380) at ../../v8/src/debug.cc:979 BUG=None R=eseidel@chromium.org Review URL: https://codereview.chromium.org/743673002
Sky
Sky is an experiment in building a UI framework for Mojo. The approach we're exploring is to create a layered framework based around a retained hierarchy of semantic elements. We're experimenting with different ideas and exploring various approaches, many of which won't work and will need to be discarded, but, if we're lucky, some of which might turn out to be useful.
Sky has three layers, each of which also adds progressively more opinion. At the lowest layer, Sky contains a rendering engine that parses markup, executes script, and applies styling information. Layered above the engine is a collection of components that define the interactive behavior of a suite of widgets, such as input fields, buttons, and menus. Above the widget layer is a theme layer that gives each widget a concrete visual and interactive design.
Elements
The Sky engine contains a handful of primitive elements and the tools with which to create custom elements. The following elements are built into the engine:
script: Executes scriptstyle: Defines style rulesimport: Loads a moduleiframe: Embeds another Mojo applicationtemplate: Captures descendants for use as a templatecontent: Visually projects descendents of the shadow hostshadow: Visually projects older shadow roots of the shadow hostimg: Displays an imagediv: Neutral element for hooking styles in shadow treesspan: Neutral element for hooking styles in shadow treesa: Links to another Mojo applicationtitle: Briefly describes the current application state to the usert: Preserve whitespace (by default, whitespace nodes are dropped)error: Represents a parse error
Additional Elements
In addition to the built-in elements, frameworks and applications can define
custom elements. The Sky framework contains a number of general-purpose
elements, including input, button, menu, toolbar, video, and
dialog. However, developers are free to implement their own input fields,
buttons, menus, toolbars, videos, or dialogs with access to all the same engine
features as the frame because the framework does not occupy a privileged
position in Sky.
Custom Layout
TODO: Describe the approach for customizing layout.
Custom Painting
TODO: Describe the approach for customizing painting.
Modules
Sky applications consist of a collection of modules. Each module can describe its dependencies, register custom elements, and export objects for use in other modules.
Below is a sketch of a typical module. The first import element imports the
Sky framework, which defines the sky-element element. This module then uses
sky-element to define another element, my-element. The second import
element imports another module and gives it the name foo within this module.
For example, the AnnualReport constructor uses the BalanceSheet class
exported by that module.
SKY MODULE
<import src=”/sky/framework” />
<import src=”/another/module.sky” as=”foo” />
<sky-element name=”my-element”>
class extends SkyElement {
constructor () {
this.addEventListener('click', (event) => this.updateTime());
this.shadowRoot.appendChild('Click to show the time');
}
updateTime() {
this.shadowRoot.firstChild.replaceWith(new Date());
}
}
</sky-element>
<script>
class AnnualReport {
constructor(bar) {
this.sheet = new foo.BalanceSheet(bar);
}
frobinate() {
this.sheet.balance();
}
}
function mult(x, y) {
return x * y;
}
function multiplyByTwo(x) {
return mult(x, 2);
}
module.exports = {
AnnualReport: AnnualReport,
multiplyByTwo: multiplyByTwo,
};
</script>
The script definitions are local to each module and cannot be referenced by
other modules unless exported. For example, the mult function is private to
this module whereas the multiplyByTwo function can be used by other modules
because it is exported. Similarly, this module exports the AnnualReport
class.
Services
Sky applications can access Mojo services and can provide services to other Mojo
applications. For example, Sky applications can access the network using Mojo's
network_service. Typically, however, Sky applications access services via
frameworks that provide idiomatic interfaces to the underlying Mojo services.
These idiomatic interfaces are layered on top of the underlying Mojo service,
and developers are free to use the underlying service directly.
As an example, the following is a sketch of a module that wraps Mojo's
network_service in a simpler functional interface:
SKY MODULE
<import src=”mojo:shell” as=”shell” />
<import src="/mojo/network/network_service.mojom.sky" as="net" />
<import src="/mojo/network/url_loader.mojom.sky" as="loader" />
<script>
module.exports = function fetch(url) {
return new Promise(function(resolve, reject) {
var networkService = shell.connectToService(
"mojo:network_service", net.NetworkService);
var request = new loader.URLRequest({
url: url, method: "GET", auto_follow_redirects: true});
var urlLoader = networkService.createURLLoader();
urlLoader.start(request).then(function(response) {
if (response.status_code == 200)
resolve(response.body);
else
reject(response);
});
};
};
</script>
Notice that the shell module is built-in and provides access to the
underlying Mojo fabric but the net and loader modules run inside Sky and
encode and decode messages sent over Mojo pipes.
Specifications
We're documenting Sky with a set of technical specifications that define precisely the behavior of the engine. Currently both the implementation and the specification are in flux, but hopefully they'll converge over time.
Contributing
Instructions for building and testing Sky are contained in HACKING.md. For
coordination, we use the #mojo IRC channel on
Freenode.
History
Sky started from the Blink codebase r181355: http://blink.lc/blink/tree/?id=086acdd04cbe6fcb89b2fc6bd438fb8819a26776