Procházet zdrojové kódy

Check that the ace text matches ShareJS each time

James Allen před 12 roky
rodič
revize
6ad8566e24

+ 14 - 2
services/web/public/coffee/editor/Document.coffee

@@ -1,6 +1,7 @@
 define [
 	"editor/ShareJsDoc"
 	"libs/backbone"
+	"libs/underscore"
 ], (ShareJsDoc) ->
 	class Document
 		@getDocument: (ide, doc_id) ->
@@ -13,14 +14,25 @@ define [
 			@connected = @ide.socket.socket.connected
 			@joined = false
 			@wantToBeJoined = false
+			@_checkConsistency = _.bind(@_checkConsistency, @)
 			@_bindToEditorEvents()
 			@_bindToSocketEvents()
 
-		attachToAce: (ace) ->
-			@doc?.attachToAce(ace)
+		attachToAce: (@ace) ->
+			@doc?.attachToAce(@ace)
+			editorDoc = @ace.getSession().getDocument()
+			editorDoc.on "change", @_checkConsistency
 
 		detachFromAce: () ->
 			@doc?.detachFromAce()
+			editorDoc = @ace.getSession().getDocument()
+			editorDoc.off "change", @_checkConsistency
+
+		_checkConsistency: () ->
+			editorValue = @ace?.getValue()
+			sharejsValue = @doc?.getSnapshot()
+			if editorValue != sharejsValue
+				@_onError "error", new Error("Editor text does not match server text")
 
 		getSnapshot: () ->
 			@doc?.getSnapshot()

+ 5 - 2
services/web/public/coffee/ide.coffee

@@ -174,8 +174,11 @@ define [
 			meta.client_now = new Date()
 			meta.recent_events = @recentEvents
 			errorObj = {}
-			for key in Object.getOwnPropertyNames(error)
-				errorObj[key] = error[key]
+			if typeof error == "object"
+				for key in Object.getOwnPropertyNames(error)
+					errorObj[key] = error[key]
+			else if typeof error == "string"
+				errorObj.message = error
 			$.ajax
 				url: "/error/client"
 				type: "POST"