diff --git a/.travis.yml b/.travis.yml index d6e50303e2..57e6dfa9ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ env: global: - DISPLAY=':99.0' - YARN_VERSION='0.24.5' - - MC_COMMIT='22d2831cc1f4' # https://hg.mozilla.org/mozilla-central/shortlog + - MC_COMMIT='6ffbba9ce0ef' # https://hg.mozilla.org/mozilla-central/shortlog notifications: slack: diff --git a/assets/dictionary.txt b/assets/dictionary.txt index c241f64803..a362ad1278 100644 --- a/assets/dictionary.txt +++ b/assets/dictionary.txt @@ -1,85 +1,86 @@ -sexualized -dispel -lifecycle -Yulia -intermittents -discoverable. +.mozconfig +.png +1x +7x +8x +addon +Aframe +airtable +amelzer +APIs +args +asm +Assaf +Asynchronicity +AUTOCLOBBER=1 +benchmarking blackboxed -fixup -scrollbars -li +blandy +Bomsy +CLRF +cmd +componentDidMount +componentWillUnmount +contextmenu +createClass +CRM +discoverable. +dispel +displayNames errored -Yura extns -travis +featureFlag +findSource +fixup +GH +href +intermittents +Jiel +Klabnik +li +lifecycle +linter +mapDispatchToProps mc +mk_add_options +MobX mochii -asm +monospace +nuxt +onKeyDown +param +prettyPrint +profiler q4 -featureFlag -displayNames -componentDidMount -.png -Klabnik -rebasing -unstaged rebases +rebasing +retext +runtime +scrollbars +secondaryPanel +selectLocation +selectSource +setPopupObjectProperties +sexualized sha -7x -8x -1x -un-hide -Jiel -Tohm +ship2gecko Sneha -Bomsy -prettyPrint -Aframe -contextmenu -cmd -monospace -nuxt stacktraces -secondaryPanel -onKeyDown -Unselects -CLRF +subdirectory svgs -componentWillUnmount -createClass -retext -GH -ship2gecko -blandy -param -mk_add_options -AUTOCLOBBER=1 -.mozconfig -href -linter -findSource -airtable -waitForPaused +Talos +talos togglePaneCollapse -CRM -addon +Tohm +travis UIs -Asynchronicity -args -APIs -Yury -runtime -Assaf -Varenya -MobX +un-hide +Unselects +unstaged urls -mapDispatchToProps -amelzer -selectSource -selectLocation -talos -Talos -subdirectory +Varenya +waitForPaused webpage -profiler -benchmarking +Yulia +Yura +Yury \ No newline at end of file diff --git a/docs/debugger-html-react-redux-overview.md b/docs/debugger-html-react-redux-overview.md index da21ab776f..d953b2cd9e 100644 --- a/docs/debugger-html-react-redux-overview.md +++ b/docs/debugger-html-react-redux-overview.md @@ -582,13 +582,10 @@ file exports the following functions: sources action. This loads up the editor with text for the specific frame. The SELECT\_FRAME action is then dispatched. -- loadObjectProperties() – This function is called from the Scopes - component, which passes the data to the ObjectInspector component as - a property to display in the variable tree under the Scopes panel. - This function is also called directly from the ObjectInspector as - the variable tree is expanded. The function calls the connected - client to retrieve the values and dispatches the - LOAD\_OBJECT\_PROPERTIES action. +- setPopupObjectProperties() – This function is called from the + Popup component, which then use this data to pass all the properties from + the hovered variable as root nodes of the ObjectInspector component. + The function dispatches the SET\_POPUP\_OBJECT\_PROPERTIES action. ## sources diff --git a/package.json b/package.json index 15dd1351be..94ee58c596 100644 --- a/package.json +++ b/package.json @@ -72,10 +72,10 @@ "babylon": "^6.18.0", "codemirror": "^5.28.0", "devtools-components": "^0.0.2", - "devtools-launchpad": "^0.0.112", + "devtools-launchpad": "^0.0.113", "devtools-linters": "^0.0.4", "devtools-map-bindings": "^0.3.2", - "devtools-reps": "^0.12.4", + "devtools-reps": "^0.19.0", "devtools-source-map": "^0.14.7", "devtools-splitter": "^0.0.6", "devtools-utils": "^0.0.10", diff --git a/src/actions/pause/index.js b/src/actions/pause/index.js index 13ff6034fd..cee7967321 100644 --- a/src/actions/pause/index.js +++ b/src/actions/pause/index.js @@ -16,6 +16,6 @@ export { resumed } from "./resumed"; export { continueToHere } from "./continueToHere"; export { breakOnNext } from "./breakOnNext"; export { mapFrames } from "./mapFrames"; -export { loadObjectProperties } from "./loadObjectProperties"; +export { setPopupObjectProperties } from "./setPopupObjectProperties"; export { pauseOnExceptions } from "./pauseOnExceptions"; export { selectFrame } from "./selectFrame"; diff --git a/src/actions/pause/loadObjectProperties.js b/src/actions/pause/setPopupObjectProperties.js similarity index 62% rename from src/actions/pause/loadObjectProperties.js rename to src/actions/pause/setPopupObjectProperties.js index bdc4148f9a..d4357c14e5 100644 --- a/src/actions/pause/loadObjectProperties.js +++ b/src/actions/pause/setPopupObjectProperties.js @@ -4,26 +4,25 @@ // @flow -import { PROMISE } from "../utils/middleware/promise"; -import { getLoadedObject } from "../../selectors"; +import { getPopupObjectProperties } from "../../selectors"; import type { ThunkArgs } from "../types"; /** * @memberof actions/pause * @static */ -export function loadObjectProperties(object: any) { +export function setPopupObjectProperties(object: any, properties: Object) { return ({ dispatch, client, getState }: ThunkArgs) => { const objectId = object.actor || object.objectId; - if (getLoadedObject(getState(), objectId)) { + if (getPopupObjectProperties(getState(), object.actor)) { return; } dispatch({ - type: "LOAD_OBJECT_PROPERTIES", + type: "SET_POPUP_OBJECT_PROPERTIES", objectId, - [PROMISE]: client.getProperties(object) + properties }); }; } diff --git a/src/actions/types.js b/src/actions/types.js index 8f0bb15593..f19ffb9bd8 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -241,11 +241,9 @@ type PauseAction = | { type: "COMMAND", value: { type: string }, command: string } | { type: "SELECT_FRAME", frame: Frame, scopes: Scope[] } | { - type: "LOAD_OBJECT_PROPERTIES", + type: "SET_POPUP_OBJECT_PROPERTIES", objectId: string, - status: string, - value: Object, - "@@dispatch/promise": any + properties: Object } | { type: "ADD_EXPRESSION", diff --git a/src/actions/utils/middleware/log.js b/src/actions/utils/middleware/log.js index eef1cec58b..0785760bf0 100644 --- a/src/actions/utils/middleware/log.js +++ b/src/actions/utils/middleware/log.js @@ -6,7 +6,7 @@ import { isTesting } from "devtools-config"; const blacklist = [ - "LOAD_OBJECT_PROPERTIES", + "SET_POPUP_OBJECT_PROPERTIES", "SET_SYMBOLS", "OUT_OF_SCOPE_LOCATIONS" ]; diff --git a/src/client/firefox.js b/src/client/firefox.js index 0715fafcab..f37161762c 100644 --- a/src/client/firefox.js +++ b/src/client/firefox.js @@ -7,12 +7,20 @@ import { setupCommands, clientCommands } from "./firefox/commands"; import { setupEvents, clientEvents } from "./firefox/events"; import { features } from "../utils/prefs"; +import type { Grip } from "debugger-html"; +let DebuggerClient; + +function createObjectClient(grip: Grip) { + return DebuggerClient.createObjectClient(grip); +} export async function onConnect(connection: any, actions: Object): Object { const { tabConnection: { tabTarget, threadClient, debuggerClient } } = connection; + DebuggerClient = debuggerClient; + if (!tabTarget || !threadClient || !debuggerClient) { return { bpClients: {} }; } @@ -59,4 +67,4 @@ export async function onConnect(connection: any, actions: Object): Object { return { bpClients }; } -export { clientCommands, clientEvents }; +export { createObjectClient, clientCommands, clientEvents }; diff --git a/src/components/Editor/Preview/Popup.js b/src/components/Editor/Preview/Popup.js index 6e4e6a3495..c6ed83c7d7 100644 --- a/src/components/Editor/Preview/Popup.js +++ b/src/components/Editor/Preview/Popup.js @@ -8,28 +8,37 @@ import React, { Component } from "react"; import { connect } from "react-redux"; import Reps from "devtools-reps"; -const { REPS: { Rep }, MODE, ObjectInspectorUtils } = Reps; -const { ObjectInspector } = Reps; -const { getChildren } = ObjectInspectorUtils; +const { REPS: { Rep }, MODE, ObjectInspector, ObjectInspectorUtils } = Reps; + +const { + createNode, + getChildren, + getValue, + nodeIsPrimitive +} = ObjectInspectorUtils.node; +const { loadItemProperties } = ObjectInspectorUtils.loadProperties; import actions from "../../../actions"; -import { getLoadedObjects } from "../../../selectors"; +import { getAllPopupObjectProperties } from "../../../selectors"; import Popover from "../../shared/Popover"; import PreviewFunction from "../../shared/PreviewFunction"; import { markText } from "../../../utils/editor"; import { isReactComponent, isImmutable } from "../../../utils/preview"; import Svg from "../../shared/Svg"; +import { createObjectClient } from "../../../client/firefox"; import "./Popup.css"; import type { EditorRange } from "../../../utils/editor/types"; +import type { Node } from "../../../utils/sources-tree/types"; +type PopupValue = Object | null; type Props = { - loadObjectProperties: Object => void, + setPopupObjectProperties: (Object, Object) => void, addExpression: (string, ?Object) => void, - loadedObjects: Object, + popupObjectProperties: Object, popoverPos: Object, - value: Object, + value: PopupValue, expression: string, onClose: () => void, range: EditorRange, @@ -44,24 +53,37 @@ export class Popup extends Component { marker: any; pos: any; - componentDidMount() { + async componentWillMount() { const { - loadObjectProperties, - loadedObjects, value, - editor, - range + expression, + setPopupObjectProperties, + popupObjectProperties } = this.props; + const root = createNode(null, expression, expression, { value }); + + if ( + !nodeIsPrimitive(root) && + value && + value.actor && + !popupObjectProperties[value.actor] + ) { + const onLoadItemProperties = loadItemProperties(root, createObjectClient); + if (onLoadItemProperties !== null) { + const properties = await onLoadItemProperties; + setPopupObjectProperties(value, properties); + } + } + } + + componentDidMount() { + const { value, editor, range } = this.props; if (!value || !value.type == "object") { return; } this.marker = markText(editor, "preview-selection", range); - - if (value.actor && !loadedObjects[value.actor]) { - loadObjectProperties(value); - } } componentWillUnmount() { @@ -81,16 +103,19 @@ export class Popup extends Component { } getChildren() { - const { loadedObjects } = this.props; - const getObjectProperties = id => loadedObjects[id]; + const { popupObjectProperties } = this.props; const root = this.getRoot(); - const actors = {}; + const value = getValue(root); + const actor = value ? value.actor : null; + const loadedRootProperties = popupObjectProperties[actor]; + if (!loadedRootProperties) { + return null; + } const children = getChildren({ - getObjectProperties, - actors, - item: root + item: root, + loadedProperties: new Map([[root.path, loadedRootProperties]]) }); if (children.length > 0) { @@ -102,8 +127,12 @@ export class Popup extends Component { renderFunctionPreview() { const { selectSourceURL, value } = this.props; - const { location } = value; + if (!value) { + return null; + } + + const { location } = value; return (
{ ); } - renderReact(react: Object, roots: Array) { + renderReact(react: Object, roots: Array) { const reactHeader = react.displayName || "React Component"; const header = ( @@ -132,7 +161,7 @@ export class Popup extends Component { ); } - renderImmutable(immutable: Object, roots: Array) { + renderImmutable(immutable: Object) { const immutableHeader = immutable.type || "Immutable"; const header = ( @@ -142,11 +171,8 @@ export class Popup extends Component { ); - roots = [ - { - path: "entries", - contents: { value: immutable.entries } - } + const roots = [ + createNode(null, "entries", "entries", { value: immutable.entries }) ]; return ( @@ -158,21 +184,26 @@ export class Popup extends Component { } renderObjectPreview() { - const { extra: { react, immutable } } = this.props; const root = this.getRoot(); - const roots = this.getChildren(); - const grip = root.contents.value; - if (!roots) { + if (nodeIsPrimitive(root)) { + return null; + } + + const roots = this.getChildren(); + if (!Array.isArray(roots) || roots.length === 0) { return null; } + const { extra: { react, immutable } } = this.props; + const grip = getValue(root); + if (isReactComponent(grip)) { return this.renderReact(react, roots); } if (isImmutable(grip)) { - return this.renderImmutable(immutable, roots); + return this.renderImmutable(immutable); } return ( @@ -194,8 +225,7 @@ export class Popup extends Component { } renderObjectInspector(roots: Array) { - const { loadObjectProperties, loadedObjects, openLink } = this.props; - const getObjectProperties = id => loadedObjects[id]; + const { openLink } = this.props; return ( { disableWrap={true} disabledFocus={true} openLink={openLink} - getObjectProperties={getObjectProperties} - loadObjectProperties={loadObjectProperties} - // TODO: See https://github.com/devtools-html/debugger.html/issues/3555. - getObjectEntries={actor => {}} - loadObjectEntries={grip => {}} + createObjectClient={grip => createObjectClient(grip)} /> ); } renderPreview() { const { value } = this.props; + if (!value) { + return null; + } + if (value.class === "Function") { return this.renderFunctionPreview(); } @@ -246,7 +276,7 @@ export class Popup extends Component { const { popoverPos, onClose, value, editorRef } = this.props; const type = this.getPreviewType(value); - if (value.type === "object" && !this.getChildren()) { + if (value && value.type === "object" && !this.getChildren()) { return null; } @@ -267,19 +297,19 @@ const { addExpression, selectSourceURL, selectLocation, - loadObjectProperties, + setPopupObjectProperties, openLink } = actions; export default connect( state => ({ - loadedObjects: getLoadedObjects(state) + popupObjectProperties: getAllPopupObjectProperties(state) }), { addExpression, selectSourceURL, selectLocation, - loadObjectProperties, + setPopupObjectProperties, openLink } )(Popup); diff --git a/src/components/Editor/Preview/index.js b/src/components/Editor/Preview/index.js index 75d0ed0cd7..a713500097 100644 --- a/src/components/Editor/Preview/index.js +++ b/src/components/Editor/Preview/index.js @@ -22,7 +22,7 @@ import type { SelectedLocation, SourceRecord } from "../../../reducers/types"; import type { Preview as PreviewType } from "../../../reducers/ast"; type Props = { - loadObjectProperties: Object => void, + setPopupObjectProperties: Object => void, addExpression: (string, ?Object) => void, loadedObjects: Object, editor: any, @@ -127,7 +127,7 @@ class Preview extends PureComponent { const { addExpression, - loadObjectProperties, + setPopupObjectProperties, updatePreview, clearPreview } = actions; @@ -140,7 +140,7 @@ export default connect( }), { addExpression, - loadObjectProperties, + setPopupObjectProperties, updatePreview, clearPreview } diff --git a/src/components/PrimaryPanes/Sources.css b/src/components/PrimaryPanes/Sources.css index 0e49ca0fee..c32840c4b4 100644 --- a/src/components/PrimaryPanes/Sources.css +++ b/src/components/PrimaryPanes/Sources.css @@ -33,6 +33,7 @@ .sources-list .managed-tree .tree .node { padding: 0px 0px 0px 3px; + width: 100%; } .sources-list .tree img.arrow { diff --git a/src/components/SecondaryPanes/Expressions.js b/src/components/SecondaryPanes/Expressions.js index bd4d6275f5..c3e7d154fa 100644 --- a/src/components/SecondaryPanes/Expressions.js +++ b/src/components/SecondaryPanes/Expressions.js @@ -9,12 +9,10 @@ import classnames from "classnames"; import { ObjectInspector } from "devtools-reps"; import actions from "../../actions"; -import { - getExpressions, - getExpressionError, - getLoadedObjects -} from "../../selectors"; +import { getExpressions, getExpressionError } from "../../selectors"; import { getValue } from "../../utils/expressions"; +import { createObjectClient } from "../../client/firefox"; + import CloseButton from "../shared/Button/Close"; import type { List } from "immutable"; @@ -31,13 +29,11 @@ type State = { type Props = { expressions: List, expressionError: boolean, - loadedObjects: Map, addExpression: (input: string) => void, clearExpressionError: () => void, evaluateExpressions: () => void, updateExpression: (input: string, expression: Expression) => void, deleteExpression: (expression: Expression) => void, - loadObjectProperties: () => void, openLink: (url: string) => void }; @@ -76,11 +72,10 @@ class Expressions extends PureComponent { shouldComponentUpdate(nextProps, nextState) { const { editing, inputValue } = this.state; - const { expressions, expressionError, loadedObjects } = this.props; + const { expressions, expressionError } = this.props; return ( expressions !== nextProps.expressions || expressionError !== nextProps.expressionError || - loadedObjects !== nextProps.loadedObjects || editing !== nextState.editing || inputValue !== nextState.inputValue ); @@ -145,12 +140,7 @@ class Expressions extends PureComponent { }; renderExpression(expression: Expression, index: number) { - const { - expressionError, - loadObjectProperties, - loadedObjects, - openLink - } = this.props; + const { expressionError, openLink } = this.props; const { editing, editIndex } = this.state; const { input, updating } = expression; const isEditingExpr = editing && editIndex === index; @@ -182,11 +172,7 @@ class Expressions extends PureComponent { this.editExpression(expression, index, options) } openLink={openLink} - getObjectProperties={id => loadedObjects[id]} - loadObjectProperties={loadObjectProperties} - // TODO: See https://github.com/devtools-html/debugger.html/issues/3555. - getObjectEntries={actor => {}} - loadObjectEntries={grip => {}} + createObjectClient={grip => createObjectClient(grip)} />
{ export default connect( state => ({ expressions: getExpressions(state), - expressionError: getExpressionError(state), - loadedObjects: getLoadedObjects(state) + expressionError: getExpressionError(state) }), actions )(Expressions); diff --git a/src/components/SecondaryPanes/Scopes.js b/src/components/SecondaryPanes/Scopes.js index 77f197ca3c..1172e78cd2 100644 --- a/src/components/SecondaryPanes/Scopes.js +++ b/src/components/SecondaryPanes/Scopes.js @@ -7,9 +7,10 @@ import React, { PureComponent } from "react"; import { bindActionCreators } from "redux"; import { connect } from "react-redux"; import actions from "../../actions"; +import { createObjectClient } from "../../client/firefox"; + import { getSelectedFrame, - getLoadedObjects, getFrameScope, isPaused as getIsPaused, getPauseReason @@ -17,15 +18,13 @@ import { import { getScopes } from "../../utils/pause/scopes"; import { ObjectInspector } from "devtools-reps"; -import type { Pause, LoadedObject, Why } from "debugger-html"; +import type { Pause, Why } from "debugger-html"; import type { NamedValue } from "../../utils/pause/scopes/types"; import "./Scopes.css"; type Props = { isPaused: Pause, - loadedObjects: LoadedObject[], - loadObjectProperties: Object => void, selectedFrame: Object, frameScopes: Object, why: Why @@ -64,7 +63,7 @@ class Scopes extends PureComponent { } render() { - const { isPaused, loadObjectProperties, loadedObjects } = this.props; + const { isPaused } = this.props; const { scopes } = this.state; if (scopes) { @@ -74,14 +73,10 @@ class Scopes extends PureComponent { roots={scopes} autoExpandAll={false} autoExpandDepth={1} - getObjectProperties={id => loadedObjects[id]} - loadObjectProperties={loadObjectProperties} disableWrap={true} disabledFocus={true} dimTopLevelWindow={true} - // TODO: See https://github.com/devtools-html/debugger.html/issues/3555. - getObjectEntries={actor => {}} - loadObjectEntries={grip => {}} + createObjectClient={grip => createObjectClient(grip)} />
); @@ -108,8 +103,7 @@ export default connect( selectedFrame, isPaused: getIsPaused(state), why: getPauseReason(state), - frameScopes: frameScopes, - loadedObjects: getLoadedObjects(state) + frameScopes: frameScopes }; }, dispatch => bindActionCreators(actions, dispatch) diff --git a/src/components/SecondaryPanes/tests/Expressions.spec.js b/src/components/SecondaryPanes/tests/Expressions.spec.js index 0ccd0410df..f0f2d51f46 100644 --- a/src/components/SecondaryPanes/tests/Expressions.spec.js +++ b/src/components/SecondaryPanes/tests/Expressions.spec.js @@ -4,7 +4,6 @@ import Expressions from "../Expressions"; function generateDefaults(overrides) { return { - loadObjectProperties: jest.fn(), expressions: [ { input: "expression1", diff --git a/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap b/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap index 4e43379376..5201e24209 100644 --- a/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap +++ b/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap @@ -13,12 +13,9 @@ exports[`Expressions should always have unique keys 1`] = ` > , + children: ?React$Element, onMouseLeave: () => void, type?: "popover" | "tooltip" }; diff --git a/src/components/stories/Preview.js b/src/components/stories/Preview.js index e4da8026cc..72bb9d6e6e 100644 --- a/src/components/stories/Preview.js +++ b/src/components/stories/Preview.js @@ -184,7 +184,7 @@ function PreviewFactory({ dir = "ltr", theme = "light", ...props }) { editor={editor} popoverPos={popoverPos} range={range} - loadObjectProperties={() => {}} + setPopupObjectProperties={() => {}} onClose={action("onClose")} {...props} /> diff --git a/src/reducers/pause.js b/src/reducers/pause.js index 1705938d59..bf7cc35019 100644 --- a/src/reducers/pause.js +++ b/src/reducers/pause.js @@ -12,7 +12,6 @@ import { createSelector } from "reselect"; import { prefs } from "../utils/prefs"; -import { isEmpty } from "lodash"; import type { Action } from "../actions/types"; import type { Why } from "debugger-html"; @@ -94,35 +93,18 @@ function update(state: PauseState = State(), action: Action): PauseState { selectedFrameId: action.frame.id }; - case "LOAD_OBJECT_PROPERTIES": - if (action.status === "start") { - return { - ...state, - loadedObjects: { - ...state.loadedObjects, - [action.objectId]: {} - } - }; + case "SET_POPUP_OBJECT_PROPERTIES": + if (!action.properties) { + return { ...state }; } - if (action.status === "done") { - if (!action.value) { - return { ...state }; + return { + ...state, + loadedObjects: { + ...state.loadedObjects, + [action.objectId]: action.properties } - - const ownProperties = action.value.ownProperties; - const ownSymbols = action.value.ownSymbols || []; - const prototype = action.value.prototype; - - return { - ...state, - loadedObjects: { - ...state.loadedObjects, - [action.objectId]: { ownProperties, prototype, ownSymbols } - } - }; - } - break; + }; case "CONNECT": return { ...State(), debuggeeUrl: action.url }; @@ -175,7 +157,7 @@ type OuterState = { pause: PauseState }; const getPauseState = state => state.pause; -export const getLoadedObjects = createSelector( +export const getAllPopupObjectProperties = createSelector( getPauseState, pauseWrapper => pauseWrapper.loadedObjects ); @@ -196,17 +178,8 @@ export function isEvaluatingExpression(state: OuterState) { return state.pause.command === "expression"; } -export function getLoadedObject(state: OuterState, objectId: string) { - return getLoadedObjects(state)[objectId]; -} - -export function hasLoadingObjects(state: OuterState) { - const objects = getLoadedObjects(state); - return Object.values(objects).some(isEmpty); -} - -export function getObjectProperties(state: OuterState, parentId: string) { - return getLoadedObjects(state).filter(obj => obj.parentId == parentId); +export function getPopupObjectProperties(state: OuterState, objectId: string) { + return getAllPopupObjectProperties(state)[objectId]; } export function getIsWaitingOnBreak(state: OuterState) { diff --git a/src/test/mochitest/browser_dbg-expressions-error.js b/src/test/mochitest/browser_dbg-expressions-error.js index 078cd40d37..afe6baf7ce 100644 --- a/src/test/mochitest/browser_dbg-expressions-error.js +++ b/src/test/mochitest/browser_dbg-expressions-error.js @@ -21,20 +21,6 @@ function getValue(dbg, index) { return findElement(dbg, "expressionValue", index).innerText; } -function assertEmptyValue(dbg, index) { - const value = findElement(dbg, "expressionValue", index); - if (value) { - is(value.innerText, ""); - return; - } - - is(value, null); -} - -function toggleExpression(dbg, index) { - findElement(dbg, "expressionNode", index).click(); -} - async function addExpression(dbg, input) { info("Adding an expression"); findElementWithSelector(dbg, expressionSelectors.input).focus(); @@ -75,7 +61,7 @@ async function addBadExpression(dbg, input) { add_task(async function() { const dbg = await initDebugger("doc-script-switching.html"); - await togglePauseOnExceptions(dbg, true, false); + const onPausedOnException = togglePauseOnExceptions(dbg, true, false); // add a good expression, 2 bad expressions, and another good one await addExpression(dbg, "location"); @@ -83,12 +69,13 @@ add_task(async function() { await addBadExpression(dbg, "foo.batt"); await addExpression(dbg, "2"); + await onPausedOnException; + // check the value of is(getValue(dbg, 2), "(unavailable)"); is(getValue(dbg, 3), "(unavailable)"); is(getValue(dbg, 4), 2); - toggleExpression(dbg, 1); - await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES"); + await toggleExpressionNode(dbg, 1); is(findAllElements(dbg, "expressionNodes").length, 20); }); diff --git a/src/test/mochitest/browser_dbg-expressions.js b/src/test/mochitest/browser_dbg-expressions.js index d329a2e656..2e64672ba6 100644 --- a/src/test/mochitest/browser_dbg-expressions.js +++ b/src/test/mochitest/browser_dbg-expressions.js @@ -31,10 +31,6 @@ function assertEmptyValue(dbg, index) { is(value, null); } -function toggleExpression(dbg, index) { - findElement(dbg, "expressionNode", index).click(); -} - async function addExpression(dbg, input) { info("Adding an expression"); findElementWithSelector(dbg, expressionSelectors.input).focus(); @@ -75,8 +71,7 @@ add_task(async function() { ok(getValue(dbg, 2).includes("Location"), "has a value"); // can expand an expression - toggleExpression(dbg, 2); - await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES"); + await toggleExpressionNode(dbg, 2); await deleteExpression(dbg, "foo"); await deleteExpression(dbg, "location"); @@ -85,8 +80,7 @@ add_task(async function() { // Test expanding properties when the debuggee is active await resume(dbg); await addExpression(dbg, "location"); - toggleExpression(dbg, 1); - await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES"); + await toggleExpressionNode(dbg, 1); is(findAllElements(dbg, "expressionNodes").length, 17); diff --git a/src/test/mochitest/browser_dbg-minified.js b/src/test/mochitest/browser_dbg-minified.js index 946a85d00f..83d3cfe74f 100644 --- a/src/test/mochitest/browser_dbg-minified.js +++ b/src/test/mochitest/browser_dbg-minified.js @@ -3,10 +3,6 @@ // Tests minfied + source maps. -async function foo() { - return new Promise(r => setTimeout(r, 3000000)); -} - function getScopeNodeLabel(dbg, index) { return findElement(dbg, "scopeNode", index).innerText; } diff --git a/src/test/mochitest/browser_dbg-scopes-mutations.js b/src/test/mochitest/browser_dbg-scopes-mutations.js index 02ea28639a..9b64e80b10 100644 --- a/src/test/mochitest/browser_dbg-scopes-mutations.js +++ b/src/test/mochitest/browser_dbg-scopes-mutations.js @@ -10,13 +10,13 @@ function getScopeNodeValue(dbg, index) { } function expandNode(dbg, index) { - let onLoadProperties = onLoadObjectProperties(dbg); + const node = findElement(dbg, "scopeNode", index); + const objectInspector = node.closest(".object-inspector"); + const properties = objectInspector.querySelectorAll(".node").length; findElement(dbg, "scopeNode", index).click(); - return onLoadProperties; -} - -function onLoadObjectProperties(dbg) { - return waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES"); + return waitUntil( + () => objectInspector.querySelectorAll(".node").length !== properties + ); } add_task(async function() { diff --git a/src/test/mochitest/browser_dbg-scopes.js b/src/test/mochitest/browser_dbg-scopes.js index 7061629283..72db7c3913 100644 --- a/src/test/mochitest/browser_dbg-scopes.js +++ b/src/test/mochitest/browser_dbg-scopes.js @@ -1,10 +1,6 @@ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ -function toggleNode(dbg, index) { - clickElement(dbg, "scopeNode", index); -} - function getLabel(dbg, index) { return findElement(dbg, "scopeNode", index).innerText; } @@ -20,8 +16,7 @@ add_task(async function() { is(getLabel(dbg, 2), ""); is(getLabel(dbg, 4), "foo()"); - toggleNode(dbg, 4); - await waitForDispatch(dbg, "LOAD_OBJECT_PROPERTIES"); + await toggleScopeNode(dbg, 4); is(getLabel(dbg, 5), "arguments"); await stepOver(dbg); diff --git a/src/test/mochitest/head.js b/src/test/mochitest/head.js index b48eb0c1ad..6e23c55227 100644 --- a/src/test/mochitest/head.js +++ b/src/test/mochitest/head.js @@ -388,13 +388,11 @@ function isPaused(dbg) { return !!isPaused(getState()); } -async function waitForLoadedObjects(dbg) { - const { hasLoadingObjects } = dbg.selectors; - return waitForState( - dbg, - state => !hasLoadingObjects(state), - "loaded objects" - ); +async function waitForLoadedScopes(dbg) { + const scopes = await waitForElement(dbg, "scopes"); + // Since scopes auto-expand, we can assume they are loaded when there is a tree node + // with the aria-level attribute equal to "1". + await waitUntil(() => scopes.querySelector(`.tree-node[aria-level="1"]`)); } /** * Waits for the debugger to be fully paused. @@ -404,18 +402,20 @@ async function waitForLoadedObjects(dbg) { * @static */ async function waitForPaused(dbg) { - const { getSelectedScope, hasLoadingObjects } = dbg.selectors; + const { getSelectedScope } = dbg.selectors; - return waitForState( + const onScopesLoaded = waitForLoadedScopes(dbg); + const onStateChanged = waitForState( dbg, state => { const paused = isPaused(dbg); const scope = !!getSelectedScope(state); - const loaded = !hasLoadingObjects(state); - return paused && scope && loaded; + return paused && scope; }, "paused" ); + + await Promise.all([onStateChanged, onScopesLoaded]); } /* @@ -761,7 +761,6 @@ async function togglePauseOnExceptions( if (!isPaused(dbg)) { await waitForThreadEvents(dbg, "resumed"); - await waitForLoadedObjects(dbg); } return command; @@ -926,6 +925,7 @@ const selectors = { expressionNodes: ".expressions-list .tree-node", scopesHeader: ".scopes-pane ._header", breakpointItem: i => `.breakpoints-list .breakpoint:nth-child(${i})`, + scopes: ".scopes-list", scopeNode: i => `.scopes-list .tree-node:nth-child(${i}) .object-label`, scopeValue: i => `.scopes-list .tree-node:nth-child(${i}) .object-delimiter + *`, @@ -1061,6 +1061,23 @@ function toggleScopes(dbg) { return findElement(dbg, "scopesHeader").click(); } +function toggleExpressionNode(dbg, index) { + return toggleObjectInspectorNode(findElement(dbg, "expressionNode", index)); +} + +function toggleScopeNode(dbg, index) { + return toggleObjectInspectorNode(findElement(dbg, "scopeNode", index)); +} + +function toggleObjectInspectorNode(node) { + const objectInspector = node.closest(".object-inspector"); + const properties = objectInspector.querySelectorAll(".node").length; + node.click(); + return waitUntil( + () => objectInspector.querySelectorAll(".node").length !== properties + ); +} + function getCM(dbg) { const el = dbg.win.document.querySelector(".CodeMirror"); return el.CodeMirror; diff --git a/yarn.lock b/yarn.lock index 5152efcd2d..58136876c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -77,9 +77,9 @@ walk "^2.3.9" yargs "^7.0.2" -"@storybook/addon-actions@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.3.7.tgz#edc2d4fe3472a3f542d7c3ed990400b5433e58fc" +"@storybook/addon-actions@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.3.9.tgz#2b191548928467fe1dd26dcba606feafbf182d36" dependencies: deep-equal "^1.0.1" global "^4.3.2" @@ -88,37 +88,37 @@ react-inspector "^2.2.2" uuid "^3.1.0" -"@storybook/addon-links@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.3.7.tgz#df3114718bc7f0a39b6cdc61e301363768d7f2a0" +"@storybook/addon-links@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.3.9.tgz#13781ac1c21ddfe347ece6ceab8518c8d1f98a0f" dependencies: - "@storybook/components" "^3.3.7" + "@storybook/components" "^3.3.9" global "^4.3.2" prop-types "^15.5.10" -"@storybook/addons@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.3.7.tgz#cc27f4ba9da47810f7eae4013224fb5f72b22ffd" +"@storybook/addons@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.3.9.tgz#356ce7f1de892d88ca4bc5f686d06e07dd8c2108" -"@storybook/channel-postmessage@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.3.7.tgz#15bcc1525a27429348485fafb2fcbcb1091b72e1" +"@storybook/channel-postmessage@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.3.9.tgz#a59220f9ecbdbe05deac6ac4339715aa587d41dd" dependencies: - "@storybook/channels" "^3.3.7" + "@storybook/channels" "^3.3.9" global "^4.3.2" json-stringify-safe "^5.0.1" -"@storybook/channels@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.3.7.tgz#227d1aac8d8d227354bdcfcef1e4ad5bee6afc44" +"@storybook/channels@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.3.9.tgz#3116a6c5e441fd057558870b254c34fe3a9fbfb0" -"@storybook/client-logger@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-3.3.7.tgz#78d45bd1f13af2b621bbb5009a63daae381b3f94" +"@storybook/client-logger@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-3.3.9.tgz#a73e382c383c1bfa6d2ff7fa5cae77cd09efa524" -"@storybook/components@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.3.7.tgz#6f64d56e9516907cd077e66564b8171a5745bc82" +"@storybook/components@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.3.9.tgz#1f7ced8b10a0e405c1d3fd6fe7ef7b8957ddf89f" dependencies: glamor "^2.20.40" glamorous "^4.11.2" @@ -132,9 +132,9 @@ "@storybook/react-simple-di" "^1.2.1" babel-runtime "6.x.x" -"@storybook/node-logger@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-3.3.7.tgz#5c2ae1b37bdd37c42a8c5d5f013cbb0e241f3c0b" +"@storybook/node-logger@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-3.3.9.tgz#c070ef5ced91b1b1aa7bb3e402855db277ed426b" dependencies: chalk "^2.3.0" npmlog "^4.1.2" @@ -165,16 +165,16 @@ babel-runtime "^6.5.0" "@storybook/react@^3.2.5": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.3.7.tgz#646f59773d9bb266b10c95124b638fffced28c2d" - dependencies: - "@storybook/addon-actions" "^3.3.7" - "@storybook/addon-links" "^3.3.7" - "@storybook/addons" "^3.3.7" - "@storybook/channel-postmessage" "^3.3.7" - "@storybook/client-logger" "^3.3.7" - "@storybook/node-logger" "^3.3.7" - "@storybook/ui" "^3.3.7" + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.3.9.tgz#2bd203a5b3c5e5fad4a756ca41d78e62cd49b160" + dependencies: + "@storybook/addon-actions" "^3.3.9" + "@storybook/addon-links" "^3.3.9" + "@storybook/addons" "^3.3.9" + "@storybook/channel-postmessage" "^3.3.9" + "@storybook/client-logger" "^3.3.9" + "@storybook/node-logger" "^3.3.9" + "@storybook/ui" "^3.3.9" airbnb-js-shims "^1.4.0" autoprefixer "^7.2.3" babel-loader "^7.1.2" @@ -226,11 +226,11 @@ webpack-dev-middleware "^1.12.2" webpack-hot-middleware "^2.21.0" -"@storybook/ui@^3.3.7": - version "3.3.7" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.3.7.tgz#6d58b65955e47ac65588b7244c587fe28df3a1f3" +"@storybook/ui@^3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.3.9.tgz#abb1df557131b174bf3c0879863a309ee85de8e3" dependencies: - "@storybook/components" "^3.3.7" + "@storybook/components" "^3.3.9" "@storybook/mantra-core" "^1.7.2" "@storybook/react-komposer" "^2.0.3" babel-runtime "^6.26.0" @@ -646,14 +646,14 @@ autoprefixer@^6.3.1: postcss-value-parser "^3.2.3" autoprefixer@^7.1.2, autoprefixer@^7.2.3: - version "7.2.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.4.tgz#29b367c03876a29bfd3721260d945e3545666c8d" + version "7.2.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.5.tgz#04ccbd0c6a61131b6d13f53d371926092952d192" dependencies: - browserslist "^2.10.2" - caniuse-lite "^1.0.30000784" + browserslist "^2.11.1" + caniuse-lite "^1.0.30000791" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^6.0.15" + postcss "^6.0.16" postcss-value-parser "^3.2.3" aws-sign2@~0.6.0: @@ -1042,12 +1042,12 @@ babel-plugin-module-resolver@^2.2.0: resolve "^1.2.0" babel-plugin-react-docgen@^1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-1.8.1.tgz#6e08e057f5dcd46b434e7553e971baa604dae377" + version "1.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-1.8.2.tgz#4615da43588c8cf5bdcae028f217954c70e6770b" dependencies: babel-types "^6.24.1" - lodash "4.x.x" - react-docgen "^2.15.0" + lodash "^4.17.0" + react-docgen "^2.20.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -1212,7 +1212,7 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transfor babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: +babel-plugin-transform-es2015-destructuring@6.23.0, babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: @@ -1602,12 +1602,13 @@ babel-preset-minify@^0.2.0: lodash.isplainobject "^4.0.6" babel-preset-react-app@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.0.tgz#d77f6061ab9d7bf4b3cdc86b7cde9ded0df03e48" + version "3.1.1" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.1.tgz#d3f06a79742f0e89d7afcb72e282d9809c850920" dependencies: babel-plugin-dynamic-import-node "1.1.0" babel-plugin-syntax-dynamic-import "6.18.0" babel-plugin-transform-class-properties "6.24.1" + babel-plugin-transform-es2015-destructuring "6.23.0" babel-plugin-transform-object-rest-spread "6.26.0" babel-plugin-transform-react-constant-elements "6.23.0" babel-plugin-transform-react-jsx "6.24.1" @@ -1962,11 +1963,11 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^2.1.2, browserslist@^2.10.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.0.tgz#50350d6873a82ebe0f3ae5483658c571ae5f9d7d" +browserslist@^2.1.2, browserslist@^2.11.1: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" dependencies: - caniuse-lite "^1.0.30000784" + caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" bser@1.0.2: @@ -2100,12 +2101,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000789" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000789.tgz#5cf3fec75480041ab162ca06413153141e234325" + version "1.0.30000792" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000792.tgz#a7dac6dc9f5181b675fd69e5cb06fefb523157f8" -caniuse-lite@^1.0.30000784: - version "1.0.30000789" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000789.tgz#2e3d937b267133f63635ef7f441fac66360fc889" +caniuse-lite@^1.0.30000791, caniuse-lite@^1.0.30000792: + version "1.0.30000792" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz#d0cea981f8118f3961471afbb43c9a1e5bbf0332" capture-stack-trace@^1.0.0: version "1.0.0" @@ -2253,13 +2254,12 @@ clap@^1.0.9: chalk "^1.1.3" class-utils@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.5.tgz#17e793103750f9627b2176ea34cfd1b565903c80" + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" - lazy-cache "^2.0.2" static-extend "^0.1.1" classnames@^2.2.5: @@ -2435,7 +2435,7 @@ commander@2.1.x: version "2.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" -commander@2.12.x, commander@^2.11.0, commander@^2.12.2, commander@^2.5.0, commander@^2.8.1, commander@^2.9.0, commander@~2.12.1: +commander@2.12.x: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" @@ -2445,9 +2445,13 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.11.0, commander@^2.12.2, commander@^2.5.0, commander@^2.8.1, commander@^2.9.0, commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + common-tags@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.0.tgz#2457c9d6c64f22b250c84c11c9b3f98b428f3083" + version "1.7.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771" dependencies: babel-runtime "^6.26.0" @@ -2961,10 +2965,14 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@1.1.1, depd@~1.1.1: +depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" +depd@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -3003,13 +3011,22 @@ devtools-components@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/devtools-components/-/devtools-components-0.0.2.tgz#4eb22cb5140e65741b00b79a7f76454ff56fa501" +devtools-components@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/devtools-components/-/devtools-components-0.1.4.tgz#a59d380060a4d802d25fb8b7227ecfa59dc46c18" + dependencies: + prop-types "^15.6.0" + react-dom-factories "^1.0.2" + svg-inline-loader "^0.8.0" + svg-inline-react "^3.0.0" + devtools-config@^0.0.15: version "0.0.15" resolved "https://registry.yarnpkg.com/devtools-config/-/devtools-config-0.0.15.tgz#1fbe75be3f4dc1159603927fc1dfa64d1d9f1202" -devtools-connection@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/devtools-connection/-/devtools-connection-0.0.7.tgz#1ec211018dc863079adb5422cf398f1201078c39" +devtools-connection@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/devtools-connection/-/devtools-connection-0.0.8.tgz#f0f77fd7116334138f55a8ccc2b9f93bf1bbb9ed" devtools-contextmenu@^0.0.7: version "0.0.7" @@ -3017,9 +3034,9 @@ devtools-contextmenu@^0.0.7: dependencies: devtools-modules "^0.0.32" -devtools-launchpad@^0.0.112: - version "0.0.112" - resolved "https://registry.yarnpkg.com/devtools-launchpad/-/devtools-launchpad-0.0.112.tgz#e9c713c3eb2003f518e39f2ec8c08934a4c4dc0f" +devtools-launchpad@^0.0.113: + version "0.0.113" + resolved "https://registry.yarnpkg.com/devtools-launchpad/-/devtools-launchpad-0.0.113.tgz#60e5112ec8f0f3a6ed342e89149b79a2fca0e873" dependencies: amd-loader "0.0.8" autoprefixer "^7.1.2" @@ -3043,7 +3060,7 @@ devtools-launchpad@^0.0.112: css-loader "^0.26.1" debug "^3.1.0" devtools-config "^0.0.15" - devtools-connection "^0.0.7" + devtools-connection "^0.0.8" devtools-contextmenu "^0.0.7" devtools-mc-assets "^0.0.4" devtools-modules "^0.0.33" @@ -3152,16 +3169,16 @@ devtools-modules@^0.0.33: dependencies: jest "^19.0.2" -devtools-reps@^0.12.4: - version "0.12.4" - resolved "https://registry.yarnpkg.com/devtools-reps/-/devtools-reps-0.12.4.tgz#51466f69d17d4f77dec57c54fd5b3d3b80ccc71b" +devtools-reps@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/devtools-reps/-/devtools-reps-0.19.0.tgz#6f41507ffdc7254126b4afba29ec17e13cffed82" dependencies: classnames "^2.2.5" - devtools-components "^0.0.2" + devtools-components "^0.1.4" lodash "^4.17.2" - react "=15.3.2" - react-dom "=15.3.2" - svg-inline-react "^1.0.2" + prop-types "^15.6.0" + react-dom-factories "^1.0.2" + svg-inline-react "^3.0.0" devtools-source-map@^0.14.7: version "0.14.7" @@ -3410,9 +3427,9 @@ duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" -duplexify@^3.1.2, duplexify@^3.4.2: - version "3.5.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" +duplexify@^3.4.2, duplexify@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -3478,8 +3495,8 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" dependencies: once "^1.4.0" @@ -3586,10 +3603,10 @@ es-to-primitive@^1.1.1: is-symbol "^1.0.1" es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.37" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3" + version "0.10.38" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3" dependencies: - es6-iterator "~2.0.1" + es6-iterator "~2.0.3" es6-symbol "~3.1.1" es5-shim@^4.5.9: @@ -3600,7 +3617,7 @@ es6-error@^4.0.2: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" -es6-iterator@^2.0.1, es6-iterator@~2.0.1: +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" dependencies: @@ -3705,8 +3722,8 @@ eslint-plugin-flowtype@^2.36.0: lodash "^4.15.0" eslint-plugin-jest@^21.5.0: - version "21.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.6.1.tgz#adca015bbdb8d23b210438ff9e1cee1dd9ec35df" + version "21.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.6.2.tgz#aaa7b37c621e49aa0b13f4dc5f7038f73c64b438" eslint-plugin-mozilla@^0.4.4: version "0.4.10" @@ -3716,8 +3733,8 @@ eslint-plugin-mozilla@^0.4.4: sax "1.2.4" eslint-plugin-prettier@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.4.0.tgz#85cab0775c6d5e3344ef01e78d960f166fb93aae" + version "2.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.5.0.tgz#39a91dd7528eaf19cd42c0ee3f2c1f684606a05f" dependencies: fast-diff "^1.1.1" jest-docblock "^21.0.0" @@ -4011,8 +4028,8 @@ extglob@^0.3.1: is-extglob "^1.0.0" extglob@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.3.tgz#55e019d0c95bf873949c737b7e5172dba84ebb29" + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -6395,8 +6412,8 @@ listr@^0.12.0: strip-ansi "^3.0.1" livereload-js@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + version "2.3.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" load-json-file@^1.0.0: version "1.1.0" @@ -6577,14 +6594,14 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@4.x.x, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" +lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -7209,13 +7226,13 @@ node-libs-browser@^2.0.0: vm-browserify "0.0.4" node-notifier@^5.0.1, node-notifier@^5.0.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: growly "^1.3.0" - semver "^5.3.0" - shellwords "^0.1.0" - which "^1.2.12" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" node-pre-gyp@^0.6.39: version "0.6.39" @@ -8237,7 +8254,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13, postcss@^6.0.14, postcss@^6.0.15, postcss@^6.0.6, postcss@^6.0.8: +postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13, postcss@^6.0.14, postcss@^6.0.15, postcss@^6.0.16, postcss@^6.0.6, postcss@^6.0.8: version "6.0.16" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.16.tgz#112e2fe2a6d2109be0957687243170ea5589e146" dependencies: @@ -8258,8 +8275,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@^1.6.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.9.2.tgz#96bc2132f7a32338e6078aeb29727178c6335827" + version "1.10.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" pretty-error@^2.0.2: version "2.1.1" @@ -8406,13 +8423,20 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pump@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.0.tgz#7946da1c8d622b098e2ceb2d3476582470829c9d" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3, pumpify@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" + version "1.3.6" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.6.tgz#00d40e5ded0a3bf1e0788b1c0cf426a42882ab64" dependencies: - duplexify "^3.1.2" - inherits "^2.0.1" - pump "^1.0.0" + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" punycode@1.3.2: version "1.3.2" @@ -8491,8 +8515,8 @@ randomatic@^1.1.3: kind-of "^4.0.0" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" dependencies: safe-buffer "^5.1.0" @@ -8543,7 +8567,7 @@ react-addons-perf@^15.4.2: fbjs "^0.8.4" object-assign "^4.1.0" -react-docgen@^2.15.0: +react-docgen@^2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-2.20.0.tgz#41a6da483a34a4aaed041a9909f5e61864d681cb" dependencies: @@ -8559,10 +8583,6 @@ react-dom-factories@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/react-dom-factories/-/react-dom-factories-1.0.2.tgz#eb7705c4db36fb501b3aa38ff759616aa0ff96e0" -react-dom@=15.3.2: - version "15.3.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.3.2.tgz#c46b0aa5380d7b838e7a59c4a7beff2ed315531f" - react-dom@^0.14.0: version "0.14.9" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.14.9.tgz#05064a3dcf0fb1880a3b2bfc9d58c55d8d9f6293" @@ -8620,8 +8640,8 @@ react-inspector@^2.2.2: is-dom "^1.0.9" react-modal@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.1.10.tgz#8898b5cc4ebba78adbb8dea4c55a69818aa682cc" + version "3.1.11" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.1.11.tgz#95c8223fcee7013258ad2d149c38c9f870c89958" dependencies: exenv "^1.2.0" prop-types "^15.5.10" @@ -8693,14 +8713,6 @@ react-treebeard@^2.1.0: shallowequal "^0.2.2" velocity-react "^1.3.1" -react@=15.3.2: - version "15.3.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.3.2.tgz#a7bccd2fee8af126b0317e222c28d1d54528d09e" - dependencies: - fbjs "^0.8.4" - loose-envify "^1.1.0" - object-assign "^4.1.0" - react@^0.14.0: version "0.14.9" resolved "https://registry.yarnpkg.com/react/-/react-0.14.9.tgz#9110a6497c49d44ba1c0edd317aec29c2e0d91d1" @@ -8720,7 +8732,7 @@ react@^15.6.2: read-all-stream@^3.0.0: version "3.1.0" - resolved "http://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" dependencies: pinkie-promise "^2.0.0" readable-stream "^2.0.0" @@ -8794,7 +8806,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -9691,7 +9703,7 @@ selenium-webdriver@=3.3.0: tmp "0.0.30" xml2js "^0.4.17" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -9824,7 +9836,7 @@ shellsubstitute@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shellsubstitute/-/shellsubstitute-1.2.0.tgz#e4f702a50c518b0f6fe98451890d705af29b6b70" -shellwords@^0.1.0: +shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -10076,12 +10088,12 @@ stream-each@^1.1.0: stream-shift "^1.0.0" stream-http@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + version "2.8.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.2.6" + readable-stream "^2.3.3" to-arraybuffer "^1.0.0" xtend "^4.0.0" @@ -10333,10 +10345,6 @@ svg-inline-react@3.0.0, svg-inline-react@^3.0.0: dependencies: prop-types "^15.5.0" -svg-inline-react@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/svg-inline-react/-/svg-inline-react-1.0.3.tgz#68d15bf88f99f64daa52821ed5441612d8ad9041" - svg-tag-names@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/svg-tag-names/-/svg-tag-names-1.1.1.tgz#9641b29ef71025ee094c7043f7cdde7d99fbd50a" @@ -10633,17 +10641,17 @@ ua-parser-js@^0.7.9: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" uglify-es@^3.3.4: - version "3.3.5" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.5.tgz#cf7e695da81999f85196b15e2978862f13212f88" + version "3.3.7" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.7.tgz#d1249af668666aba7cb1163e277455be9eb393cf" dependencies: - commander "~2.12.1" + commander "~2.13.0" source-map "~0.6.1" uglify-js@3.3.x: - version "3.3.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.5.tgz#4c4143dfe08e8825746675cc49a6874a933b543e" + version "3.3.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.7.tgz#28463e7c7451f89061d2b235e30925bf5625e14d" dependencies: - commander "~2.12.1" + commander "~2.13.0" source-map "~0.6.1" uglify-js@^2.6, uglify-js@^2.8.27, uglify-js@^2.8.29: @@ -10962,8 +10970,8 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" uuid@^3.0.0, uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + version "3.2.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.0.tgz#19a63e22b3b32a0ba23984a4f384836465e24949" v8flags@^2.1.1: version "2.1.1" @@ -10987,8 +10995,8 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" velocity-animate@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.0.tgz#fc8771d8dfe1136ff02a707e10fbb0957c4b030f" + version "1.5.1" + resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.1.tgz#606837047bab8fbfb59a636d1d82ecc3f7bd71a6" velocity-react@^1.3.1: version "1.3.3" @@ -11285,7 +11293,7 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@^1.1.1, which@^1.2.10, which@^1.2.12, which@^1.2.9: +which@^1.1.1, which@^1.2.10, which@^1.2.12, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: