Browse Source

String >> htmlTextContent

Herbert Vojčík 7 years ago
parent
commit
9073541e3a
4 changed files with 102 additions and 4 deletions
  1. 60 2
      src/DOMite-Tests.js
  2. 8 0
      src/DOMite-Tests.st
  3. 28 2
      src/DOMite.js
  4. 6 0
      src/DOMite.st

+ 60 - 2
src/DOMite-Tests.js

@@ -1,5 +1,7 @@
-define("domite/DOMite-Tests", ["amber/boot", "amber_core/SUnit"], function($boot){"use strict";
-var $core=$boot.api,nil=$boot.nil,$recv=$boot.asReceiver,$globals=$boot.globals;
+define(["amber/boot", "amber_core/SUnit"], function($boot){"use strict";
+if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
+var $core=$boot.api,nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
+if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
 $core.addPackage('DOMite-Tests');
 $core.packages["DOMite-Tests"].innerEval = function (expr) { return eval(expr); };
 $core.packages["DOMite-Tests"].transport = {"type":"amd","amdNamespace":"domite"};
@@ -211,6 +213,30 @@ messageSends: ["<<", "new", "testedClass", "newStream", "assertBodyEndsWith:", "
 }),
 $globals.DOMiteTest);
 
+$core.addMethod(
+$core.method({
+selector: "testEntityConversion",
+protocol: 'testing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+self._assert_equals_("&copy;"._htmlTextContent(),"©");
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"testEntityConversion",{},$globals.DOMiteTest)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "testEntityConversion\x0a\x09self assert: '&copy;' htmlTextContent equals: '©'",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["assert:equals:", "htmlTextContent"]
+}),
+$globals.DOMiteTest);
+
 $core.addMethod(
 $core.method({
 selector: "testFromBadSelectorIsInvalid",
@@ -988,6 +1014,38 @@ messageSends: ["fromElement:", "testedClass", "newElement:", "<<", "resetContent
 }),
 $globals.DOMiteTest);
 
+$core.addMethod(
+$core.method({
+selector: "testTextContentDoesNotRunScript",
+protocol: 'testing',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+self._shouldnt_raise_((function(){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return "<script>throw new Error(\x22Intentional\x22)</script>"._htmlTextContent();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
+//>>excludeEnd("ctx");
+}),$globals.Error);
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"testTextContentDoesNotRunScript",{},$globals.DOMiteTest)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "testTextContentDoesNotRunScript\x0a\x09self shouldnt: [ '<script>throw new Error(\x22Intentional\x22)</script>' htmlTextContent ] raise: Error",
+referencedClasses: ["Error"],
+//>>excludeEnd("ide");
+messageSends: ["shouldnt:raise:", "htmlTextContent"]
+}),
+$globals.DOMiteTest);
+
 $core.addMethod(
 $core.method({
 selector: "testedClass",

+ 8 - 0
src/DOMite-Tests.st

@@ -55,6 +55,10 @@ testDefaultInsertStringInFragment
 	document body removeChild: document body lastChild
 !
 
+testEntityConversion
+	self assert: '&copy;' htmlTextContent equals: '©'
+!
+
 testFromBadSelectorIsInvalid
 	| d |
 	d := self testedClass at: '#goo'.
@@ -191,5 +195,9 @@ testMultipleInsertsWithClearInBetween
 	d resetContents.
 	d << 'dom-mite'.
 	self assertBodyEndsWith: '>dom-mite</div>'
+!
+
+testTextContentDoesNotRunScript
+	self shouldnt: [ '<script>throw new Error("Intentional")</script>' htmlTextContent ] raise: Error
 ! !
 

+ 28 - 2
src/DOMite.js

@@ -1,5 +1,7 @@
-define("domite/DOMite", ["amber/boot", "amber_core/Kernel-Collections"], function($boot){"use strict";
-var $core=$boot.api,nil=$boot.nil,$recv=$boot.asReceiver,$globals=$boot.globals;
+define(["amber/boot", "amber_core/Kernel-Collections"], function($boot){"use strict";
+if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
+var $core=$boot.api,nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
+if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
 $core.addPackage('DOMite');
 $core.packages["DOMite"].innerEval = function (expr) { return eval(expr); };
 $core.packages["DOMite"].transport = {"type":"amd","amdNamespace":"domite"};
@@ -1368,4 +1370,28 @@ messageSends: ["nextPut:"]
 }),
 $globals.ProtoStream);
 
+$core.addMethod(
+$core.method({
+selector: "htmlTextContent",
+protocol: '*DOMite',
+fn: function (){
+var self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var d=document.createElement("div");d.innerHTML=self;return d.textContent || d.innerText;;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"htmlTextContent",{},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "htmlTextContent\x0a<var d=document.createElement(\x22div\x22);d.innerHTML=self;return d.textContent || d.innerText;>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: []
+}),
+$globals.String);
+
 });

+ 6 - 0
src/DOMite.st

@@ -356,3 +356,9 @@ nextPutDomNode: aNode
 	self nextPut: aNode
 ! !
 
+!String methodsFor: '*DOMite'!
+
+htmlTextContent
+<var d=document.createElement("div");d.innerHTML=self;return d.textContent || d.innerText;>
+! !
+