Commit graph

853 commits

Author SHA1 Message Date
Christian Williams 901eea203e Styling aliens with a yellow background; preventing absolute positioning
Change-Id: I86fbbda841d69beeabf4e683de3b032fb70b1ac6
2012-11-05 14:22:10 -08:00
Trevor Parscal d2b839a2cb Fixed font-size issues for monobook integration
Change-Id: If71fbd186979777b73c84f64610c8485017de654
2012-11-05 13:32:06 -08:00
Catrope efbb94e548 Merge "Improved the responsiveness of the context menu" 2012-11-05 20:52:58 +00:00
Trevor Parscal 4e377480cf Improved the responsiveness of the context menu
* Added selectionStart and selectionEnd events to ve.ce.Surface
* Switched from debouncing model change events to just ignoring
  model change events while the user is in selection mode
  (dragging mouse or pressing shift+arrow keys)
* Fixed bug with callout appearing on resize.

Change-Id: I3bb9952867a983a4f7612964ff719a1179dd0fc6
2012-11-05 12:47:47 -08:00
Catrope 4d7952d55c Integration revamp for December release
* Remove VisualEditor namespace, and restrictions on it
** For MW.org these will be moved to mediawiki-config
* Add $wgVisualEditorNamespaces
* Add visualeditor-enable preference and respect it
* Use $skin->getTitle() rather than $wgTitle
* Remove "Sandbox" from i18n message
* Remove duplicate enforcement of VE namespace from JS

Change-Id: I956f68c2dde55e4063530fcc7c90eda048e0d78b
2012-11-05 12:46:14 -08:00
Trevor Parscal 0b6c6e7bf1 Merge "Introduce meta-linmod" 2012-11-05 19:01:32 +00:00
Trevor Parscal 289e762812 Removed ve.init's dependencies on ve.ui styles
* Things broke when ve.ui stuff was refactored
* Save dialog is now completely stand-alone

This is an alterantive to Ib028e6967e8d2e158b05fd7582620c21cf9b85fb
which I believe is a better approach.

Change-Id: I7cb52d0750e859c4052e2008d929d197b88b9877
2012-11-05 10:35:36 -08:00
Catrope 857535b63f Introduce meta-linmod
* ve.dm.Converter still generates metaInline/metaBlock elements as
  before, it's not affected by this change
* ve.dm.Document constructor splits its input into "real" data and
  metadata
** Metadata is stored in this.metadata (the meta-linmod) as a sparse
   array of arrays, with an element for each offset in this.data
** this.data itself does not contain the metadata
** This means the node tree also doesn't contain the metadata
** Which means CE doesn't know about it at all
* All splice operations on the linear model are sent through
  ve.dm.Document.spliceData(), which performs the splice and syncs the
  meta-linmod
** Metadata in the removed range is reaped and added to the metadata for
   the offset immediately following the removal
* ve.dm.Document.getFullData() splices the linmod and meta-linmod back
  into each other; this "full data" is then fed back to ve.dm.Converter

Change-Id: Ief6dfd5b59cc13a8457993ed85c725413029c4fb
2012-11-02 19:06:49 -07:00
Trevor Parscal d631bac3db Merge "Base for inspectors & context menu to operate on 0 length selection." 2012-11-02 21:38:14 +00:00
Rob Moen 5d86bc4379 Base for inspectors & context menu to operate on 0 length selection.
* Allow inspector to open with 0 length selection.
* Allow context menu to open with 0 length selection.
* Fixed bug in doc.getAnnotationsFromRange on zero length selection:
  Method now returns annotations from start vs empty annotation set.

Change-Id: I3937c5c2824c7396d0c3ee11c13ffecdbed6052a
2012-11-02 13:08:32 -07:00
Catrope 471836ef35 Merge "Cleanup tool API" 2012-10-31 18:23:45 +00:00
Trevor Parscal a4e0e83f24 Cleanup tool API
* Moved to tool specific configuration to static properties (left tool instance specific stuff in the constructors)
* Added documentation for tool configurations
* Centralized typePattern matching for inspectors

Change-Id: Ieacf61b320c10fd37ea69a05e543313fa990b403
2012-10-31 11:10:17 -07:00
Catrope 6ef9fa78ff Fix ve.batchSplice() to behave in line with docs
* Actually return the spliced data like the docs claim we do
* Remove false claim that offset can be negative
* Add that data=[] && remove=0 is invalid; native splice() doesn't allow
  this, and there is a case where we call native splice() directly
* Add tests

Change-Id: I90e77c1b22ea1c36cb61e89ea47831885a0b1cb9
2012-10-30 10:05:49 -07:00
Trevor Parscal 82a15d66fc Merge "Fix copyObject/copyArray behavior with null values" 2012-10-30 16:59:02 +00:00
Catrope d30096ebd3 Fix copyObject/copyArray behavior with null values
Previously copyObject and copyArray would silently drop null values,
which is bad, especially considering we have example data for meta nodes
that has { 'key': null } somewhere.

Also added a test case that failed prior to this change.

Change-Id: I4f233cce041fbf38f701c494f1f78ac3d8535d88
2012-10-29 19:45:25 -07:00
Catrope 6df508cf8b Add InspectorFactory to tests
Tests were completely broken because the link inspector threw a JS error
when trying to register itself with the nonexistent inspector factory.

Change-Id: I8a47222f0a5a37348262ed939b37fbc47d14e222
2012-10-29 18:36:54 -07:00
Rob Moen 765f7589ac Fix bug where link inspector / context overlay would no longer show.
Change-Id: I73281dc32eae5660662898d0290468434e7326d9
2012-10-29 10:56:11 -07:00
Trevor Parscal f2a83960f8 (bug #41434) Converting format across 2 lists with paragraphs in between fail
Thanks to Roan for suggesting this fix.

Change-Id: I754dc34fbd3aaf2bdcb78bf89bfc896b612b4ee6
2012-10-26 15:18:44 -07:00
Trevor Parscal 21ea11c161 Really properly initialize static member before adding stuff to it
Kill them console log errors 'til they're dead.

Change-Id: I7329f4c869f46a9ef664af8ab49cb2504abdf972
2012-10-26 15:10:01 -07:00
Trevor Parscal cd0b28d407 Properly initialize static member before adding stuff to it
This was causing a console error

Change-Id: Ic394cf4d4821bd7c03fd32bb9e202801dccde085
2012-10-26 15:02:24 -07:00
Catrope a87ffeefa1 Merge "Whitespace and comment cleanup on ve.ce.SurfaceObserver" 2012-10-26 21:59:00 +00:00
Trevor Parscal 3142a4e66f Add commands to ve.Surface
First stab at a simple command interface. This and commandFactory
will be refactored significantly before this code is put into
action.

Change-Id: I0de5d3271198c987baf06fb3011aebdc1671f498
2012-10-26 14:50:23 -07:00
Trevor Parscal 238feeb881 Tools changes
* Rewrite of all tools, dramatically simplifiying them and decreasing
  duplication
* Tools are now created using a tool factory instead of
  a make-shift facility built into the toolbar
* All UI object have a surface or a toolbar reference instead of a
  surface view

Change-Id: I589ecba36bf715b452d03c8fd5c0547dc3c1dc61
2012-10-26 14:48:27 -07:00
Rob Moen 9563f0880d UI context reorganization, inspector rewrite, iframe refactor, icon generalization
* Only show the inspector if the selected text has an inspectable annotation
* Replace the inline menu with a toolbar containing inspectable annotations
* Change the appearance of the inspector to match new mockups
* Add the trash can icon for removing annotations
* Move iframe handling code into a class that manages all that nonsense

Change-Id: I840f72426f9a9e50054a28de950393f0e9913153
2012-10-26 14:46:11 -07:00
Trevor Parscal 735ed96f5f Add ve.Action, ve.ActionFactory, subclasses
Moved implementation of all the tools into a reusable action
system. To execute an action just call

surface.execute( actionName, method, param1, param2, ... );

This helps keep tools simple, and opens the door to key commands
reusing the same code.

Change-Id: Ie786fa3d38d1ea17d39b5dfb8eeeb5f2256267ce
2012-10-26 14:44:17 -07:00
Trevor Parscal ed7273da25 Add ve.dm.Surface.has{Past,Future}State, add docs
Will be used by the history tools in a future commit, providing
a reasonable interface to this information rather than the tool
reaching into private members.

Change-Id: I0472349968e9b48ec17eb47b6845ec9ccf3811e2
2012-10-26 14:43:09 -07:00
Trevor Parscal fcbe1d7b9c Add ve.dm.Node.hasAttributes()
Will be used in future commits to reduce duplication.

Change-Id: Ibde934d5a55b980010e84b6242f8d968e88cea54
2012-10-26 14:42:40 -07:00
Trevor Parscal 79944333a4 Add ve.dm.Node.hasMatchingAncestor()
Will be used in future commits to avoid traversing up the tree and
comparing type and attributes.

Change-Id: I993f4cbe20018406dbb4a3c9d1ce2f8766f8e1ba
2012-10-26 14:41:49 -07:00
Trevor Parscal 7d741253f3 Add ve.dm.SurfaceFragment.getAnnotations()
Change-Id: Ifb731e8fdd0f111f5da4ac0d882adaad3f48fdce
2012-10-26 11:03:51 -07:00
Catrope bc8b042e5f Merge "Fix annotation object creation in SurfaceFragment" 2012-10-26 17:53:10 +00:00
Trevor Parscal 44a78129c4 Whitespace and comment cleanup on ve.ce.SurfaceObserver
Change-Id: Ice4058f1041f3d0118c7955122b8ea4d538790e0
2012-10-26 10:27:54 -07:00
Trevor Parscal 52f1aac90a Merge "Test: Enforce # of expected assertions." 2012-10-26 16:48:18 +00:00
Krinkle b6b899c396 Merge "Documentation fixes" 2012-10-25 21:19:05 +00:00
Timo Tijhof 4cc2101ffd Test: Enforce # of expected assertions.
Change-Id: I041c792d1841f69677f8c7d38f67108475a0afc9
2012-10-25 22:06:07 +02:00
Krinkle dae235111c Merge "Fix JS error in ve.setProp()" 2012-10-25 19:55:16 +00:00
Catrope 84efb81e7e Fix JS error in ve.setProp()
Attempting to descend into a string or number would cause a JS error,
because we would attempt to create prop[arguments[i]] as an empty object
(which is ignored), then try to descend into it (which blows up because
it's undefined, even though we've just set it). Guard against this by
explicitly checking for non-object-ness.

Change-Id: Ie65550baaae0ab88476c9a1ff40cc136090740a0
2012-10-25 21:54:45 +02:00
Trevor Parscal 4e87a7a79b Fix number of doc sync tests
Follow up to I84f0368b1d7b601ed0766806607152dc97f34603

Change-Id: Ic1e9de1e755b8966b6e964b01b00f4d99d27245e
2012-10-25 11:06:12 -07:00
Catrope 2c1683ecff DocumentSynchronizer fix and cleanup
* Adjust the range in the annotation synchronizer, otherwise we emit
  events for the wrong node
* Expanded test suite to the point where it was able to catch the bug
  caused by not adjusting annotated ranges
* Removed selection.length === 0 check, no longer needed because
  selectNodes() now throws an exception in this case
* Added a FIXME comment about duplicate update events that occur when
  length adjustments are combined with something else
* Add a few more comments

Change-Id: I84f0368b1d7b601ed0766806607152dc97f34603
2012-10-25 11:02:58 -07:00
Trevor Parscal 551a30bc64 Merge "Actually use nodeOuterRange, selectNodes() has provided this forever" 2012-10-25 18:00:15 +00:00
Trevor Parscal fe5c5b78f9 Merge "Reorganize text-only replacement detection" 2012-10-25 17:56:45 +00:00
Trevor Parscal 8e7facf222 Merge "Guard transactions against double commit/rollback" 2012-10-25 17:55:56 +00:00
Trevor Parscal 9c51bb2d7b Merge "No longer copy data in ve.dm.Document constructor" 2012-10-25 17:54:23 +00:00
Catrope f1dbdac3d8 Actually use nodeOuterRange, selectNodes() has provided this forever
Change-Id: Ie1d3cbb6e475248927d10f411cf383f701a3ad71
2012-10-24 17:48:48 -07:00
Catrope 5d5335b498 Reorganize text-only replacement detection
* Lift node assignment out of the if/else
* Flip the condition so we detect text-only replacements rather than
  non-text-only replacements
* Additionally assert that there is exactly one selected node, and that
  it is a text node

Change-Id: Iaaddf532f06709e860ac44457470e6d8bfcb6dd9
2012-10-24 17:48:20 -07:00
Catrope 29cff8c105 Guard transactions against double commit/rollback
* Store the applied state in the Transaction
* Store the Transaction in the TransactionProcessor (previously, only
  its operations were stored)
* Have commit() and rollback() throw exceptions when passed transactions
  with the wrong applied state
* Add tests for this behavior

Change-Id: I27b7a96fdf4d3555d78f64c05a03702ea560c802
2012-10-24 17:47:41 -07:00
Catrope 43f1612324 No longer copy data in ve.dm.Document constructor
The data array is now taken by reference, and the caller must perform
any copying required.

Changed tests to make a deep copy of shared data sets (mostly
ve.dm.example) before passing them to ve.dm.Document().

Change-Id: Iedc64f9fd9cd689640de9a19379cf5f3db94a2bb
2012-10-24 17:32:35 -07:00
Catrope aa2836aa6e Remove 'internal' property from DM nodes
There's no use case for keeping a deep copy of the 'internal' property
in the node tree, and it was breaking some of my new tests concerning
change markers. We could keep internal data in the node tree if we
wanted to, but to be correct we'd have to synchronize every time we
changed it, which is a pain.

Change-Id: I024de1ff8b6b6154da82c103c4bb21db8ff2ec14
2012-10-24 16:47:14 -07:00
Trevor Parscal 8c3802308e Fix annotation object creation in SurfaceFragment
Also add a comment about how the way data is passed to a new annotation
needs to be improved

Change-Id: I693e4f5632b4eae0d2ee3468ee979454314f6364
2012-10-24 16:47:04 -07:00
Trevor Parscal f17fc65c41 Documentation fixes
Change-Id: I5020623ba59cd9d1794b7d1f97d3adf77b833d6e
2012-10-24 16:47:04 -07:00
Trevor Parscal b8dc697f17 Merge "ve.ui.CommandFactory: Initial implementation" 2012-10-24 18:48:40 +00:00
Timo Tijhof 34cbc729db ve.ui.CommandFactory: Initial implementation
Based on https://github.com/ccampbell/mousetrap.

Cleaned up to fit our coding standards, pass JSHint, and assume
jQuery's fixes where possible (e.g. no need for an addEvent
utility, no need for filling e.target, e.which, etc. cross-browser
which jQuery.Event already does).

Initially all were local functions in the constructor, but to
allow some customisations in subclasses moved various methods
to the prototype instead and marked with @private.

Really, only .register() must be called from the outside. The rest
assumes normalisation etc. or might break things if called
incorrectly.

Change-Id: Ic69a3c70759052094aefbeab623d885f8b118e14
2012-10-24 17:48:16 +00:00
Timo Tijhof 37f3a288ec Standards: Fix global variables and pass JSHint.
Follows-up:
* IK 714e29d30f
* IK 3b8a5ae4d5
* IK 72eb2825e5
* RK 7fe7182f43
* ...

Change-Id: I671f08e4899bfb9508cef272190ec72721a0af9a
2012-10-23 00:53:48 +02:00
Trevor Parscal bb97cd928b Merge "Add parentOuterRange to selectNodes() output" 2012-10-22 17:34:53 +00:00
Catrope 8d82da1fb5 Merge "Rename property "timeout" to "timeoutId" - more descriptive." 2012-10-22 17:08:39 +00:00
Inez Korczyński 88c22b3a46 Rename property "timeout" to "timeoutId" - more descriptive.
Change-Id: I198d07e3c59ba1283085135f45882ce606bb2389
2012-10-19 17:11:59 -07:00
Catrope 4e89867fc0 Merge "Removed htmlTagName and htmlAttributes from hash" 2012-10-19 23:35:57 +00:00
Trevor Parscal d09bc496c3 Merge "Fix for native deletion - it was breaking document (model and view) when deleting really fast (holding the key for example). This solution completely fix the problem, however it is not optimal - stop and start is called more often than should be." 2012-10-19 23:33:24 +00:00
Trevor Parscal 8ea206c743 Removed htmlTagName and htmlAttributes from hash
This was only causing data bloat and also errors because htmlTagName and htmlAttributes are only set if the annotation was constructed from an HTML element

Change-Id: I3d36bca6cd0194e1a4456bb51156117f70b96b13
2012-10-19 16:01:28 -07:00
Catrope 61b6c1ce86 Add parentOuterRange to selectNodes() output
This is the outer range of the parent of the node, if known. We'll need
this for change marking: when resizing a text node, for instance, we
need to mark its containing parent. This way we get the containing
parent's element's offset for free (selectNodes already tracks it in
currentFrame) rather than having to compute it with another traversal.

Change-Id: Ia335d8080ea9d414ab9f89b943e2ea0cd11d7df3
2012-10-19 15:28:26 -07:00
Trevor Parscal 54171d03b6 Merge "Do reference comparison in selectNodes() tests and fix test data" 2012-10-19 22:21:55 +00:00
Trevor Parscal 2aec6b04e8 Merge "Add missing var statement" 2012-10-19 22:20:46 +00:00
Catrope ef513244be Do reference comparison in selectNodes() tests and fix test data
Some tests were using the wrong node in the expected data, but because
only the summaries were compared, this would succeeed as long as the
type and length were equal (and paragraphs of length 1 are quite common
in our test data). Fixed equalNodeSelection() to compare each node by
reference as well as comparing the summaries. If one of the equality
tests fails, the summaries will still be displayed as expected/actual
data (even though they might be equal), and the message will  have
"(reference equality for selection[3].node)" appended to it.

This change broke the tests because a few test cases had bad data, fixed
those in this commit as well.

Change-Id: Iab420cf29d47f7368c8a9ce79f6309efae75685c
2012-10-19 13:56:46 -07:00
Catrope cc9c530690 Add ve.setProp()
Change-Id: I6f932917f8e6321e9c415900b70404406af96d5c
2012-10-19 11:22:12 -07:00
Catrope bfb7e6f40c Add missing var statement
Change-Id: I573e952c60550c29bf7958c221899b72a934fb0c
2012-10-19 11:06:46 -07:00
Christian Williams bab6ca6a60 (bug 41055) Fixing large content copy and paste from external source for Firefox/Windows
Change-Id: I7169566cca486eb5085922c5ac8d932c60a7dcbb
2012-10-18 15:59:55 -07:00
Inez Korczyński 6735a47dcb Fix for native deletion - it was breaking document (model and view) when deleting really fast (holding the key for example). This solution completely fix the problem, however it is not optimal - stop and start is called more often than should be.
Change-Id: Ied5b34f92056407311aa1e84fbff35943138987f
2012-10-18 13:22:20 -07:00
Trevor Parscal 7ee5245a2d Merge "Fix selectNodes() bug reported by Inez" 2012-10-17 23:24:43 +00:00
Catrope 937607893c Fix selectNodes() bug reported by Inez
For <p>1<br/>2</p>, selectNodes([2,2]) correctly returned the end of the
first text node, but selectNodes([4,4]) returned index 2 in the
paragraph (i.e. between the break node and the second text node). The
correct behavior is to return the start of the second text node, i.e.
the mirror image of the behavior for [2,2].

Fixed this by applying the startBetween/endBetween logic only if the
relevant adjacent node is wrapped (or if it's missing). In the code,
this is expressed as !(adjacent node present && adjacent node wrapped).

Change-Id: Ie3b7fdf1de38ee253a798a7a73bc89734f4ca4fa
2012-10-17 16:09:49 -07:00
Inez Korczyński 4b1b63d357 "Is there data?" a.k.a. Insert data only if there is a data to be inserted.
Change-Id: If5957c38668f4dedcba72fc79f9a273614c6dce3
2012-10-17 16:08:02 -07:00
Trevor Parscal 435d45cf9e Merge "Fix bug in ve.ce.BrancNode.setupSlugs. It was removing slugs from the DOM, but not from the internal (this.slugs) collection, so getSlugAtOffset was returning incorrect information." 2012-10-17 21:17:23 +00:00
Inez Korczyński 829b070330 Fix bug in ve.ce.BrancNode.setupSlugs. It was removing slugs from the DOM, but not from the internal (this.slugs) collection, so getSlugAtOffset was returning incorrect information.
Change-Id: I0307d2dfe5c62f992287532ef8925fead2899c58
2012-10-17 13:54:14 -07:00
Catrope 84e598953a Wrap inline elements properly
The HTML "1<br/>2" was being converted to a linmod that looked like
"<p>1</p><br></br><p>2</p>". This commit fixes the wrapping logic such
that the result is "<p>1<br></br>2</p>" instead. In general, inline
nodes (content nodes) should not interrupt the wrapping, but block nodes
should.

This creates a problem for alien nodes: normally, we determine whether an
alien node is a block alien or an inline alien based on context, but if
we're in wrapping mode we're unsure of the context. We can't tell the
difference between "1<tt>Foo</tt>2" (should be wrapped as one, because
tt is inline) and "1<figure></figure>2" (1 and 2 should be wrapped
separately, because figure is block) using context alone, so in these
cases (and ONLY in these cases) we look up whether the HTML tag in
question is an inline tag or a block tag and use that to decide.

Change-Id: I75e7f3da387dd401d9b93e09a21751951eccbb83
2012-10-17 13:50:29 -07:00
Christian Williams 156e56b47b Fixing location of ve.ce.CenterNode.js and adding comma between variable declarations
Change-Id: If54e314f47860ac30060bec6b3f5997ed3709e0b
2012-10-17 13:18:57 -07:00
Inez Korczyński 5c83742313 (Bug 41120) Missing coma. Who knows how it happened...
Change-Id: I4c0a65cc751bf378368df9f8b793f672fb7cca15
2012-10-17 12:48:11 -07:00
Trevor Parscal 5cd4222d9c Whitespace and comment cleanup for dm annotation classes
* Added comments to classes and methods
* Quieted a jshint warning
* Broke some long lines
* Replaced instances of "var\t" with "var "

Change-Id: I1d617ed9e5180f1a3dff42078fb5debb5d718407
2012-10-17 12:35:28 -07:00
Trevor Parscal 1c5ac9d502 Merge "Fix exception when deleting all text (Ctrl+A Backspace)" 2012-10-17 19:33:48 +00:00
Inez Korczyński 874adec1ac (Bug 41120) When getOffset is called for a slug offset there is no need to traverse DOM - we can simply just call getSlugAtOffset and use that information.
Change-Id: I46b21ca0d3ca11d72c77feeb884f7d92a201de36
2012-10-17 12:32:27 -07:00
Trevor Parscal 64442e03d8 Merge "Fix JS error in DocumentSynchronizer when adding to an empty document" 2012-10-17 19:28:58 +00:00
Trevor Parscal 020a04f3dc Merge "Get annotations from first character of a range" 2012-10-17 19:28:05 +00:00
Trevor Parscal a981d98b1e Merge "Fix path issues with missing files, inconsistent subset in demo, test & mediawiki." 2012-10-17 19:27:16 +00:00
Christian Williams 280b0a368e (bug 41092) Fixing cut
Surface was being accidentally locked when we actually want the surface to re-render.

Change-Id: I1d20faec8e55934e1fff7534c7d8cfe94d19031d
2012-10-16 23:33:28 -07:00
Christian Williams 7a2faf7daf Ignore backspace keypress
Firefox triggers a keypress event for backspace. We handle backspace in keydown, so this keypress event should be ignored.

Change-Id: I6a481dbd5df0cf4558a5f1975717ca809250ccda
2012-10-16 12:23:57 -07:00
Timo Tijhof edc5f38d4c Fix path issues with missing files, inconsistent subset in demo, test & mediawiki.
* CenterNode missing in ResourceLoader registry
* UI classes and rangy not in static test/index.html
* Transaction and TransactionProcessor listed twice

Added a maintenance script that generates the <script> and <link> tags for all
files in the same order everywhere.

Change-Id: I5d22d33769b4e356e8065d295505f6f9a8b0bea8
2012-10-16 10:03:26 -04:00
Christian Williams 177557808b (bug 33064) Ignore non-content keypresses
Ignore keypress handling for any keypress with e.which of 0.

Change-Id: Ifa8a562eb882b337bad466183849ba9871605653
2012-10-15 23:05:47 -07:00
Christian Williams 40cc89eb50 Get annotations from first character of a range
If you select some text and start typing, we will now remove the content in the range and new content will be annotated with the annotations from the first character in the deleted range. This is similar to other editors.

Change-Id: I46ced52665ab10f9b724dbb225df5687c18a4c3a
2012-10-15 17:39:28 -07:00
Catrope 0054cd2a57 Fix exception when deleting all text (Ctrl+A Backspace)
Exception was caused by passing -1 to getAnnotationsFromOffset(). So
check for -1 before passing it in; getNearestContentOffset() can
legitimately return -1 if there are no content offsets in the document,
which occurs when the document is empty.

I was originally going to change getNearestContentOffset(start - 1, -1)
to getRelativeContentOffset(start, -1), but Inez correctly pointed out
that that would have unwanted results when near an inline node.

Change-Id: Ife4b497b1c5fd04d411bb25cea99e6ea2abf146f
2012-10-15 15:03:08 -07:00
Catrope 91964a48d0 Fix JS error in DocumentSynchronizer when adding to an empty document
This was reproducible by blanking the entire document (Ctrl+A Delete),
then undoing that (Ctrl+Z). AFAIK that's the only way to trigger an
insertion on a document that is completely empty.

Change-Id: I22252d5972a413dff614880a90c4c6b22e79672d
2012-10-15 15:01:39 -07:00
Rob Moen 7db62daac7 Fix bold and italic key commands in surfaceView.
Change-Id: Iefc436a27285fd811b9d1ac2c684160fe7818a30
2012-10-15 14:47:40 -07:00
Inez Korczyński dac224e110 Added support for Ime in IE. In IE when starting IME sequence 'compositionStart' is called to late, but fortunatelty we can do all necessary job in handler for 'keyDown'.
Change-Id: Id6f15015c45afd81cf8e74d3e03f7fa21611862d
2012-10-14 12:28:06 -07:00
Catrope a64587e44f Merge "Reversed the default value of autoSelect in surface fragments" 2012-10-13 01:10:10 +00:00
Catrope a328a43373 Fix UI for annotation API changes
Change-Id: Ib8341436ba966628c93854a742d8b3a5b45a1d83
2012-10-12 17:53:42 -07:00
Trevor Parscal 6c3878be9e Added multiple name registration to ve.Factory
Also changed from using "type" to "name" to make it less specific and added a test to make sure it's working.

Change-Id: I150a7ab1a57b3df85b459dbc411c2eaefe08b5bb
2012-10-12 17:43:04 -07:00
Trevor Parscal 4fbf7308f7 Reversed the default value of autoSelect in surface fragments
Arguments with default truthy arguments are evil

Change-Id: I3fb972af1b8f52837497950281c537fe09eb7975
2012-10-12 17:34:15 -07:00
Rob Moen ab7c39cf79 Fix context icon in surfaceView
Change-Id: I742b6df25679827fd0e3096a58bb5291c5f4f77d
2012-10-12 17:18:32 -07:00
Catrope 405581f6b8 New annotation API: update tests
Change-Id: I301a1d89c33dd68197d629d187a9a5be8cbf3852
2012-10-12 15:07:28 -07:00
Catrope 8d56cadb82 New annotation API: ve.ce.TextNode integration
Finally getting rid of .annotationRenderers, yay!

Change-Id: I17cb2598de9747d1e3b68ff18ebb02efd56c04c3
2012-10-12 15:07:28 -07:00
Catrope 735ee449e3 New annotation API: ve.dm.Converter integration
The annotation-related code in the converter is greatly simplified
because the API itself takes care of almost everything already.

Change-Id: Ib48f52bad6b650a05dc4e7ef82db4158c19b3cf5
2012-10-12 15:07:28 -07:00
Catrope 613dd14332 New annotation API: convert existing annotations
This changes ve.dm.LinkAnnotation to be a generic annotation for <a>
tags, and adds ve.dm.MWInternalLinkAnnotation and
ve.dm.MWExternalLinkAnnotation as MW-specific subclasses. This nicely
splits out the MW-specific parts in LinkAnnotation, and ideally we'd
also move these files somewhere else to reflect their MW-specificity,
but I haven't gotten to that yet.

Similarly, ve.dm.TextStyleAnnotation is now a generic base class for
simple tag-only-no-metadata annotations, and it has 11 subclasses, one
for each tag we support. This is quite a bit more verbose than the
previous code, but I think it's cleaner and more flexible. I considered
writing a function that would generate a TextStyleAnnotation subclass,
then calling that 11 times, but that's not possible if we want to keep
named functions for the constructors.

Change-Id: Ifba10153eef40280e44025dd72d4e9d9f33b0632
2012-10-12 15:07:25 -07:00
Catrope 7fe7182f43 New annotation API: Annotation and AnnotationFactory classes
Fleshes out ve.dm.Annotation to a class. Annotations in the linear model
will be instances of a subclass of ve.dm.Annotation. Annotations are
defined by subclassing ve.dm.Annotation and registering this subclass
with ve.dm.AnnotationFactory.

ve.dm.AnnotationFactory keeps track of which annotation classes are known,
and has code to match an HTML element to an annotation class, for use in
the converter.

Change-Id: I68802bdb8736ced1f9e04ee49c623944b448141c
2012-10-12 15:07:02 -07:00
Catrope 9ca5da44ee Merge "Revert "No longer create zero-length text nodes"" 2012-10-12 18:04:22 +00:00
Catrope 0a6a2c7cd8 Revert "No longer create zero-length text nodes"
Inez asked for this to be merged but now says it's broken

This reverts commit 7702ec10dc
2012-10-12 18:04:15 +00:00
Inez Korczyński 3c69871f4a Refactored method ve.ce.Surface.handleInsertion. Now handling slug and insertion annotations is combined.
Change-Id: I70494c185addcf4d07d385dc1e9745aca2f9d05b
2012-10-11 16:32:32 -07:00
Trevor Parscal 55a31122b5 Merge "Support for pre-unannotating test" 2012-10-11 23:28:18 +00:00
Trevor Parscal e02a253e0e Merge "Native cursor movement" 2012-10-11 23:27:25 +00:00
Christian Williams 011069d17c Native cursor movement
The cursor will move natively when it can, allowing for word jumping with alt/ctrl keys. Special conditions exist for slugs and node boundaries that result in programatic movement.

Change-Id: Ife156bf94d8192ddd322c016ca8359855b17d7fc
2012-10-11 15:51:45 -07:00
Inez Korczyński a78719d7e4 Added missing call to surfaceObserver.clear();
Change-Id: I64eeeef8339d5765d5ce732e660eeba35482d7d3
2012-10-11 13:59:30 -07:00
Christian Williams 9719589e9a Support for pre-unannotating test
Removing check for insertAnnotations length because it's also important to know if we're pre-unannotating text.

Change-Id: I7fab39ca353d7656de3ce2985a821cb54384100e
2012-10-11 13:38:54 -07:00
Trevor Parscal f94063db12 Merge "Introduce new method in ve.ce.Surface called handleInsertion that is responsible for the magic around inserting content with new annotation, or in a slug, or with IME." 2012-10-11 19:43:18 +00:00
Trevor Parscal b3a90966f3 Merge "No longer create zero-length text nodes" 2012-10-11 19:42:52 +00:00
Inez Korczyński 4c08740794 Introduce new method in ve.ce.Surface called handleInsertion that is responsible for the magic around inserting content with new annotation, or in a slug, or with IME.
Change-Id: Ia558376d3e509d15a0746297a9dd29d09beec652
2012-10-11 12:06:17 -07:00
Trevor Parscal 2a1eb1394d Merge "Add ve.getProp()" 2012-10-11 18:26:31 +00:00
Trevor Parscal 5ad9b0c8a9 Merge "Support custom hashes in ve.getHash()" 2012-10-11 18:17:21 +00:00
Trevor Parscal 9b7f9cda42 Merge "Add ve.getOpeningHtmlTag()" 2012-10-11 18:16:55 +00:00
Trevor Parscal f72083f85c Merge "Add setDOMAttributes()" 2012-10-11 18:16:13 +00:00
Catrope a7a64abcf5 Add ve.getProp()
Change-Id: Iad9f53ae252acbeb2842645e6e66c0dfc7618f9f
2012-10-10 17:50:19 -07:00
Catrope b630b8a2a6 Support custom hashes in ve.getHash()
Change-Id: I9193472773b999b45ce850a609ad5fe141421dbf
2012-10-10 17:31:11 -07:00
Catrope 22c7f16b99 Add ve.getOpeningHtmlTag()
Utility function to generate an opening HTML tag. Needed to integrate
the new annotation API with ve.ce.TextNode

Change-Id: I6804bbf6f79346fde1887fa82d29ec5cd0342d60
2012-10-10 17:30:07 -07:00
Catrope 3f4c656275 Add setDOMAttributes()
Change-Id: I1406998400c4f7f3d0983a43e3f86afe4ffd29a6
2012-10-10 15:10:31 -07:00
Christian Williams f2d08f913b Added reversed boolean for translateOffset
Previously, Undo used a transaction's lengthDifference to calculate the selection to display after the transaction was undone. Now, translateOffset with the reversed boolean set to true will properly translate the inverse of a transaction's selection change. Fixes bug #40538

Change-Id: I110bc0cbb5824547842efd391b9f2948b037b758
2012-10-10 14:59:30 -07:00
Catrope 7702ec10dc No longer create zero-length text nodes
We were populating empty content nodes with zero-length text nodes to
make round-trip tests in the test suite work (otherwise blanking a
paragraph leaves behind a zero-length text node whereas creating an
empty paragraph does not), but the empty nodes are causing problems in
CE apparently.

* Do not create empty text nodes when constructing a node tree
* Be more careful with text-only replacements:
** Don't resize a text node to zero, remove it instead
** There may not be a text node to resize at all, build it in that case
** Switch nodeRange to nodeOuterRange, this was probably broken before

Tests:
* Change test case for zero-length text node to assert that there is
  *no* zero-length text node :)
* Remove a test case concerning an empty text node from the
  ve.ce.TextNode suite

Change-Id: Ie677457f2f0a7823a517ba3077b844ef52a20fcc
2012-10-10 14:48:47 -07:00
Timo Tijhof 07c86fc5d3 inheritClass: Implement inherited 'static' property for classes.
Previously tests for inheritClass (and other object management
utilities) were absent (as they were copied from upstream K-js).

I've copied the upstream test suite for this method here and
extended it with tests for this new feature.

Had to add es5:true to .jshintrc due to a bug in JSHint.
Repeated the setting in ve.inheritClass for future reference.

Source: https://github.com/Krinkle/K-js/blob/master/test/K.test.js

Change-Id: I63ac620d6ce7832ebfee454ddf7b7c90f6eb6121
2012-10-09 18:29:41 +00:00
Trevor Parscal bbb38c590e Merge "Add missing return in ve.getDOMAttributes()" 2012-10-09 18:21:35 +00:00
Trevor Parscal 87cb7045c1 Merge "Removing onKeyPress return statement" 2012-10-09 17:54:51 +00:00
Christian Williams 4e585eb092 Removing onKeyPress return statement
Also switched to using surfaceObserver and cleaned up some trailing whitespace.

Change-Id: If9a2b390e86f54b4c5ddfd499eefb31f0ab2c96f
2012-10-09 10:54:27 -07:00
Timo Tijhof 73851696f1 ve.Factory: No need for a-b-c workaround, createObject and apply.
This works just fine, as also previously tested/proven by
ve.cloneObject, which uses the same concept of creating an object
identical to what invoking the constructor with "new" would do,
but without invoking the constructor function (which has side-
effects).

Except in this case we do invoke the constructor function, but
we can't use new in ve.Factory because of the arbitrary number of
arguments.

Added a test to assert that 3+ arguments and that instanceof
work as expected.

Change-Id: If0add3da7475886e476900044acda2ba7d01fb11
2012-10-09 19:36:48 +02:00
Timo Tijhof a15b2f77f2 Fix constructor names; remove redundant hasOwnProperty.
Add some missing constructor names and rename the ones with a
lowercase 'v'.

I previously changed Object.create and others to using hasOwn,
but that turned out to be useless. The thought at the time was
to only use the native one if it really is a native one (and not
a polyfill from another script), however in then hasOwn is only
relevant on prototypes and when negated. For static members it
would be an own-property either way.

Follows-up:
* Id6783fcfc35a896db088ff424ff9faaabcaff716 (metanode)
* Iab763954fb8cf375900d7a9a92dec1c755d5407e (object-management)

Change-Id: Ia6ef597e5e5453277472dfc23f25d2878b68b7f6
2012-10-08 06:15:20 +02:00
Catrope ac4c259a19 Add missing return in ve.getDOMAttributes()
Change-Id: I659667a0424bf166cee95b743469e716ff11f3d9
2012-10-05 18:18:51 -07:00
Inez Korczyński 1ed7b3f96e Update ve.ce.Surface to call SurfaceObserver.stop/start/clear instead of stopPolling/startPolling/clearPollData.
Change-Id: I164599dd34304a3eaef285859a66428cf839accb
2012-10-05 14:57:42 -07:00
Catrope f434da5140 Merge "Changed method name to setAutoSelect to avoid collision" 2012-10-05 21:25:51 +00:00
Catrope ffc34ee15a Merge "Got tests working again" 2012-10-05 19:01:38 +00:00
Trevor Parscal 51ac385c98 Merge "Created QUnit tests for ve.Document.selectNodes method (mode "branches")" 2012-10-05 18:57:37 +00:00
Trevor Parscal da2d89ee3a Changed method name to setAutoSelect to avoid collision
Plus, this is more consistent with the rest of the method names

Change-Id: I713f1bfc28d22cc259ce5dba69ea053817fd43f8
2012-10-05 11:07:10 -07:00
Inez Korczyński 2d752fe60c Small clean-up in ve.ce.Surface constructor.
Change-Id: I679511cd0b22192213873ceca5d8410b56d5def9
2012-10-04 17:08:26 -07:00
Inez Korczyński 4ab9d112b7 Created QUnit tests for ve.Document.selectNodes method (mode "branches")
Change-Id: Iee243ffe1a71a23a3ad540421a0cbbb973433f58
2012-10-04 15:24:02 -07:00
Inez Korczyński b2295a2de3 Fix minor bug with incorrect usage of hasSlugAtOffset.
Change-Id: I413fc5850cd7bcae9b1d955eb951394e1ed9df36
2012-10-04 14:31:25 -07:00
Inez Korczyński 72eb2825e5 Start using ve.ce.SurfaceObserver inside ve.ce.Surface. Moved methods getOffsetOfSlug, getOffsetFromElementNode, getOffsetFromTextNode and getOffset to ve.ce.js and made them static.
Change-Id: If6ce0ae10c494392cc384341cc87b61658d4934a
2012-10-04 14:28:54 -07:00
Inez Korczyński c4299fd838 Retire ve.ce.Surface.render variable and instead of it use variable "locked" via methods lock(), unlock() and isLocked().
Change-Id: Ic476a51e9e7766bd2793c2a7d773734cf9bcd0b6
2012-10-04 14:26:06 -07:00
Inez Korczyński 3b8a5ae4d5 Initial import of ve.ce.SufaceObserver
Change-Id: Ifc14a6cc30e46c8ae99c59dcb916795c603329ed
2012-10-04 14:24:12 -07:00
Inez Korczyński 15b151ef58 Setup variable ve.debug to true when ve.debug.js is loaded.
Change-Id: I22309ddfda8271456665eb40c4b698c160061de4
2012-10-03 18:02:31 -07:00
Trevor Parscal 2c3142225f Got tests working again
I think what happened here is I added the skeleton code, Kranitor came through and removed the unused arguments, then I merged in my implementations without pulling, then pushed - git merged cleanly, the arguments I thought were there were not there, and tests broke.

Change-Id: I5aa2968fef164c774a10db83a6df1753c93cd2dc
2012-10-03 16:03:33 -07:00
Inez Korczyński 0b135ede31 Add 'branches' mode to ve.Document.selectNodes method. Tests TBD.
Change-Id: Id466b9452fd0b515831a2536ccc32caa339ee885
2012-10-03 15:55:54 -07:00
Inez Korczyński 714e29d30f Created method getSlugAtOffset in ve.ce.Document and ve.ce.BranchNode, refactored the way how slugs are added.
Change-Id: I8006c7e6e1dd3c640939bf08f39192615b2e5343
2012-10-03 15:40:44 -07:00
Trevor Parscal 58e37e78a9 Merge "Fix transaction bug with Roans help." 2012-10-03 17:56:33 +00:00
James D. Forrester 03c428155e Alter the target of the Feedback link to be the right page.
Specifically, go to [[mw:VisualEditor/Feedback]] rather than [[mw:Visual editor/
Feedback]], as the primary set of pages on MWwiki have been moved some time ago
and right now we're stranding users' feedback messages at the wrong place.

Change-Id: Ia2ba0dad7d1bf0d1633fe2704a2e8354285c66da
2012-10-02 15:41:18 -07:00
Rob Moen 3a48860602 Fix transaction bug with Roans help.
Fixes (Bug 40339)

Change-Id: Ice26bf08071cba5c5500aa9196ade169381a9aea
2012-10-01 16:31:16 -07:00
Trevor Parscal 1ab5fac1aa Merge "Using getRelativeContentOffset for insertAnnotations" 2012-10-01 21:27:54 +00:00
Trevor Parscal 57ec680d76 Merge "Add utility function to get DOM attributes as a plain object" 2012-10-01 21:27:21 +00:00
Krinkle 5ba4c9694d Merge "Added surface model lock and unlock events" 2012-10-01 21:25:08 +00:00
Trevor Parscal 903acdfdf2 Added surface model lock and unlock events
This allowed me to move ve.ce.Surface particulars (such as the starting, stopping and clearing of polling) out of the UI code.

Also cleaned up some switch statements.

Change-Id: I7b85e42a4e01f8d76237d995e25275f2424541ea
2012-10-01 14:23:11 -07:00
Catrope 7cc8096864 Add utility function to get DOM attributes as a plain object
Change-Id: I64abfb7479ae687f95e604f1df48dfe8439176ed
2012-10-01 14:14:52 -07:00