Commit graph

277 commits

Author SHA1 Message Date
Isiah Meadows
30ad45caa1
Unbreak m.trust (#2516)
* Actually return the check from `maybeSetContentEditable`

Lots of code paths relied on it being a boolean. When I created the
abstraction, I apparently forgot to make sure it returned the result.

* Don't forget to copy instance state over

* Update changelog [skip ci]

* Fix changelog issue [skip ci]
2019-08-17 14:38:10 -04:00
Isiah Meadows
39fa2b32c2
Fix #1881 + related ospec bug (#2492)
* Fix #1881 + related ospec bug

* Test duplicate resolves, update changelog
2019-07-26 18:19:40 -04:00
Isiah Meadows
4cbcaf2936
Fix link + docs (#2476)
* Fix a copy/paste fail

Also, fix some incorrect tests.

* Clarify how routes are diffed, improve key + route resolver docs

- Add some missing links to route resolvers and single-child keyed
  fragments, clarify usage around them.
- Drive-by: remove a redundant sentence that itself was missing a
  period.

* Actually test for propagation and preventDefault

Previously, the mocks were both junk and inaccurate. No wonder my tests
were silently failing - they were wrong and not obviously wrong.
2019-07-16 16:03:24 -04:00
Isiah Meadows
582bda56dc
Partially recast the router API to be a lot more intuitive. (#2469)
* Recast the router API to be a lot more intuitive.

Fixes #2387
Fixes #2072
Fixes quite a few issues reported on Gitter.

For `m.route.Link`:

- More intuitive
- More accessible
- More ergonomic
- It can be disabled
- It can be cancelled
- It can be changed
- Oh, and you can use it isomorphically.

For `m.route.prefix`

- You can *read* it.
- You can write to it, of course.
- It's literally just setting a property.

For the router itself (and the rest of Mithril):

- You can now `require("mithril")` and all its submodules without a DOM
  at all. There is a catch: you can't instantiate any routes, you can't
  mount anything, and you can't invoke `m.render` in any capacity. You
  can only use `m.route.Link`, `m.route.prefix`, hyperscript stuff, and
  `mithril/stream`, and you can use `m.request` with `background: true`
  if you use a global XHR polyfill. (You can't use `m.request` without
  `background: true` except with a DOM to redraw with.) The goal here is
  to try to get out of the way for simple testing and to defer the
  inevitable `TypeError`s for the relevant DOM methods to runtime.

  The factory requires no arguments, and in terms of globals, you can
  just figure out based on what errors are thrown what globals to
  define. Their values don't matter - they just need to be set to
  *something*, even if it's just `null` or `undefined`, before Mithril
  executes.

Had to make quite a few other changes throughout the docs and tests to
update them accordingly. Oh, and that massive router overhaul enabled me
to do all this.

Also, slip in a few drive-by fixes to the mocks so they're a little
easier to work with and can accept more URLs. This was required for a
few of the tests.

* Update changelog + numbers, add forgotten bundle option

* Add PR numbers to changelog [skip ci]

* Allow continuing to the next match by returning `false`.

* Update numbers again
2019-07-12 15:29:37 -04:00
Isiah Meadows
1f4b2cf49a
Deservicify core (#2458)
* De-servicify router (mostly)

Still uses the redraw service, but it no longer has an intermediate
service of its own.

Also, did a *lot* of test deduplication in this. About 30-40% of the
router service tests were already tested on the main router API instance
itself.

Bundle size decreased from 9560 to 9548 bytes min+gzip.

* Merge `m.mount` + `m.redraw`, update router

Simplifies the router and redraw mechanism, and makes it much easier to
keep predictable.

Bundle size down to 9433 bytes min+gzip, docs updated accordingly.

* Make `mithril/render` just return the `m.render` function directly.

* Deservicify `m.render`, revise `m.route`

- You now have to use `mithril/render/render` directly if you want an
  implicit redraw function. (This will likely be going away in v3.)
- Revise `m.route` to only `key` components

* Add `redraw` to `m.render`, deservicify requests

* Test error logging

* Update docs + changelog [skip ci]
2019-07-07 18:28:43 -04:00
Isiah Meadows
db277217f8
Move fragment type check to normalizer (#2462)
Should result in more informative stack traces.

Fixes #2461
2019-07-07 17:16:56 -04:00
Isiah Meadows
6c562d2b9b
Fix keys, normalize holes (#2452)
* Fix #2434

* Treat holes as unkeyed, normalize boolean/null/undefined

This brings a lot better consistency with that API, even though it's
slightly breaking. (I had to update a bunch of tests to correspond with
it.)

* Fill in PR number [skip ci]
2019-07-03 17:05:44 -04:00
Isiah Meadows
ddc8adbbd3
Fix #2424 (#2450)
* Fix #2424

* Add PR ref
2019-07-03 14:41:37 -04:00
Isiah Meadows
9e9b89d900
Fix #2067 (#2447)
* Fix #2067

* Add PR number [skip ci]
2019-07-03 04:53:45 -04:00
Vasil Rimar
39c20bdb34 Handle [ fragment selector. Fixes #2349 (#2352)
* Handle `[` fragment selector. Fix #2349

* Update tests

* Simplify hyperscript function
2019-01-07 04:56:09 -05:00
Isiah Meadows
966e78bcab
Allow variadic arguments to m.fragment (#2328)
* Implement support for variadic arguments to `m.fragment`

While I was at it, I refactored the common logic out of `hyperscript`.

* Add a missed change from #2326

* Update docs + changelog [skip ci]

* Explain rationale for `hyperscriptVnode`'s calling convention

This way, it doesn't get erroneously "cleaned up" into something worse,
and so it's clearer how it'd be potentially optimized once ES5 support
is dropped.
2018-12-05 23:57:42 -05:00
Isiah Meadows
8134c51a48
Fix style updates to avoid unnecessary allocation (#2312)
* Fix style updates to avoid unnecessary allocation

- Drive-by: properly censor `cssFloat` -> css `float:` to match DOM
  behavior

* Document `style` syntax + custom property support. [skip ci]

* Add a missing test

* Add a few more descriptive comments.

* Update changelog [skip ci]
2018-12-03 14:31:08 -05:00
Isiah Meadows
462fb659d7
Fix event handler this value, simplify redraw handling (#2320)
Shaves 10 bytes off the bundle from smaller name + reduced indirection
2018-12-03 06:35:27 -05:00
Isiah Meadows
4a641092dc
Officially drop IE9-10 support, pull out our hacks (#2296)
- I also fixed a bunch of related comments
- I had to polyfill `requestAnimationFrame` for Node
- Drive-by: run `eslint . --fix`
- Drive-by: update transpiling info in CONTRIBUTING.md
- Drive-by: we aren't the only ones going semicolon-free
2018-11-27 18:04:15 -05:00
Isiah Meadows
a8473e63c9
Reverse hook order for all but onbeforeupdate (#2297)
- Drive-by: `onbeforeupdate` prevents subtree redraw if *either* hook
  returns `false`, not *both*.
2018-11-27 18:02:48 -05:00
Rasmus Porsager
7c299ab48c Allow css vars with uppercase characters (#2311)
* Allow css vars with uppercase characters

* Remove charAt

* Extract dash lowercase lambda

* Extract match uppercase regex

* Set key and value correctly in updateStyle

* Fix domMock style to work like the browser
2018-11-26 09:40:08 -05:00
Barney Carroll
4c5968a526 Fix #2192 (#2308)
* Fix #2192

* Fix mock style property definitions

* Re-instate camelCased style property key declaration support

* Fix removeProperty, eslint fix

* Stringify style keys: fix perf tests

* Fix weird uncaught mixed whitespace

* Fix weird uncaught mixed whitespace
2018-11-26 05:49:16 -05:00
Rasmus Porsager
421474c0e2 Cast className using toString (#2309)
* Cast className using toString

* Add to change-log
2018-11-24 08:13:56 -05:00
Isiah Meadows
4d579c50b6
Revert "Fix #1771 and probably others (#2286)" (#2299)
4f68984f2f
2018-11-14 19:26:23 -05:00
Isiah Meadows
4f68984f2f
Fix #1771 and probably others (#2286)
This is *super* subtle, and IMHO Chrome did exactly the wrong thing
here.
2018-11-14 15:35:00 -05:00
Pierre-Yves Gérardy
d6489e3b3f Merge #2075 into next (#2175)
* fix: Access document.activeElement through a function that eats errors for IE (#2075)

* test: inline iframe.js so ospec doesn't try to run it
2018-11-07 18:42:50 -05:00
makibishi
a73c157dff refactor: Vnode.normalizeChildren to anonymous function (#2208) 2018-10-28 18:02:32 -04:00
spacejack
ea0ce7f762 Store normalized vnodes in the dom element. Add render tests. (#2266)
* Store normalized vnodes in the dom element. Add render tests.

* Add entry to change-log
2018-10-28 17:17:24 -04:00
Isiah Meadows
2635070734 Merge branch 'next' 2018-10-25 14:23:33 -04:00
Isiah Meadows
88b17c1c60
Avoid triggering Object.prototype.__proto__ with keys (#2251)
This way, the diff algorithm works with untrusted keys.
2018-10-15 15:09:55 -04:00
Isiah Meadows
62eb081a13 Simplify element removal to save a few bytes
It's also a minor peephole optimization, but I saw bigger size wins, so
I'm citing that.
2018-09-22 12:02:58 -04:00
Isiah Meadows
1ecc30a064 Fix custom elements attribute application, improve key checking
- Fix custom elements attribute application to acknowledge that not all
  custom elements operate purely based on attributes. (Plus, those
  blasted things are verbose as heck when you're working with them in
  raw form. It's also not that uncommon for functionality to be exposed
  via property and *not* attribute.)
- Don't memoize the normalized value when we 1. only use it once in each
  branch, and 2. only use it for a few special cases.
- Centralize the "has property key" code, so it's easier to tune and
  read. I also inlined a couple functions while I was at it since they
  were small and only used once.
- Actually test for how attributes are applied to raw DOM elements vs
  when we choose to use keys. When I first developed the patch, it
  silently worked, when I should've been breaking things.
2018-09-20 15:08:49 -04:00
Isiah Meadows
ad5118165c
Fix redundancy (#2213)
* Remove redundant empty fragment return

* Rebuild bundles

* Update changelog
2018-09-19 01:23:33 -04:00
Isiah Meadows
c703b03253
Unbreak accidental back-compat break with event optimization (#2222)
This was supposed to be purely additive. See here for more details:

https://github.com/MithrilJS/mithril.js/pull/1949#issuecomment-417824513
2018-09-18 10:14:21 -04:00
Sebastian Sandqvist
571b60830b [render/render] Prevent activeElement.focus on SVGs, fix #1983 2018-06-11 22:04:34 +02:00
Pierre-Yves Gérardy
32b319d140 [render/hyperscript] Normalize to class attrs to className, ignore only nullish values 2018-06-07 18:09:38 +02:00
Pierre-Yves Gérardy
8daa386e5e [render/test] add a render/hyperscript integration suite for classes 2018-06-07 18:09:38 +02:00
Pierre-Yves Gérardy
92b22fe8e6 [render/hyperscript] have the attrs take precedence over the selector, improve class normalization
fix #1773
fix #2172
2018-06-07 18:09:38 +02:00
Pierre-Yves Gérardy
3f5cabc5c5 Chore: Normalize the way we use eslint-disable 2018-06-01 21:27:02 +02:00
Pierre-Yves Gérardy
6283aa4a7d [render/render] Test for removing styles and assorted domMock changes 2018-06-01 21:27:02 +02:00
Pierre-Yves Gérardy
cfa128a5cd [render/render] make updateAttrs smarter about null values 2018-06-01 21:27:02 +02:00
Pierre-Yves Gérardy
4921083898 [render/render] Fix xlink:href handling 2018-06-01 21:27:02 +02:00
Pierre-Yves Gérardy
2469505b1b Move xlink:href test to the proper file 2018-06-01 21:27:02 +02:00
Pierre-Yves Gerardy
5b51b682ee Improve attrs removal, fix #1804 2018-06-01 21:27:02 +02:00
Pierre-Yves Gerardy
dc15acd791 Improve attrs setting performance
before:

> mutate styles/properties x 7,999 ops/sec ±10.87% (46 runs sampled)

after:

> mutate styles/properties x 16,104 ops/sec ±4.36% (66 runs sampled)
2018-06-01 21:27:02 +02:00
Pierre-Yves Gerardy
4197cf0ae1 Enable the tests for #1804 2018-06-01 21:27:02 +02:00
Pierre-Yves Gérardy
285cb5382f [render] cleanup and comments 2018-05-29 23:50:29 +02:00
Pierre-Yves Gérardy
144ce68192 [render/render] get rid of vnode.skip 2018-05-29 23:50:29 +02:00
Pierre-Yves Gérardy
2cfc68359d [render/render] Introduce longest increasing subsequence-based node moves in keyed diff, fix #1791, fix #2026 2018-05-29 23:50:29 +02:00
Pierre-Yves Gérardy
95ec3d28aa test for the LIS-based diff 2018-05-29 23:50:29 +02:00
Barney Carroll
1579fe8430
Do not normalise component children on ingestion (#2155)
* Do not normalise component children on ingestion

* Don't normalise vnode children

* Component hyperscript tests: children aren't normalised

* test, not text

* Update change log: #2155 & #2064
2018-05-29 10:53:16 +01:00
magikstm
6097cfb2e9 Small optimization in render hyperscript.js (#2064)
* Small optimization in render hyperscript.js

* Remove temporary variable

* Small optimization in render hyperscript.js

Squashed commits:

[5b103291] Small optimization in render hyperscript.js

* Remove sloppy mode comment
2018-05-18 20:48:56 +02:00
Pierre-Yves Gérardy
44e165a357 [render/render] Misc comment fixes 2018-04-23 13:52:03 +02:00
Pierre-Yves Gérardy
f7a95d8c12 Cleanup, comments, and optimize getKeyMap 2018-04-23 13:52:03 +02:00
Pierre-Yves Gérardy
801bde219e [render/render] move keyed cached nodes when needed, fix diff semantics for cached nodes, fix #2132 2018-04-23 13:52:03 +02:00