| OLD | NEW |
| 1 <!DOCTYPE HTML> | 1 <!DOCTYPE HTML> |
| 2 <html> | 2 <html> |
| 3 <script src='test.js'></script> | 3 <script src='test.js'></script> |
| 4 <script src='call_function.js'></script> | 4 <script src='call_function.js'></script> |
| 5 <script> | 5 <script> |
| 6 | 6 |
| 7 function clearCache() { |
| 8 getPageCache().cache_ = {}; |
| 9 } |
| 10 |
| 7 function testCallFunctionNoArgs() { | 11 function testCallFunctionNoArgs() { |
| 12 clearCache(); |
| 13 |
| 8 var result = callFunction(function() { return 1; }, []); | 14 var result = callFunction(function() { return 1; }, []); |
| 9 assertEquals(0, result.status); | 15 assertEquals(0, result.status); |
| 10 assertEquals(1, result.value); | 16 assertEquals(1, result.value); |
| 11 } | 17 } |
| 12 | 18 |
| 13 function testCallFunctionThrows() { | 19 function testCallFunctionThrows() { |
| 20 clearCache(); |
| 21 |
| 14 var result = callFunction(function() { throw new Error('fake error'); }, []); | 22 var result = callFunction(function() { throw new Error('fake error'); }, []); |
| 15 assertEquals(StatusCode.UNKNOWN_ERROR, result.status); | 23 assertEquals(StatusCode.UNKNOWN_ERROR, result.status); |
| 16 assertEquals('fake error', result.value); | 24 assertEquals('fake error', result.value); |
| 17 | 25 |
| 18 result = callFunction(function() { | 26 result = callFunction(function() { |
| 19 var e = new Error('fake error'); | 27 var e = new Error('fake error'); |
| 20 e.code = 77; | 28 e.code = 77; |
| 21 e.message = 'CUSTOM'; | 29 e.message = 'CUSTOM'; |
| 22 throw e; | 30 throw e; |
| 23 }, []); | 31 }, []); |
| 24 assertEquals(77, result.status); | 32 assertEquals(77, result.status); |
| 25 assertEquals('CUSTOM', result.value); | 33 assertEquals('CUSTOM', result.value); |
| 26 } | 34 } |
| 27 | 35 |
| 28 function testCallFunctionArgs() { | 36 function testCallFunctionArgs() { |
| 37 clearCache(); |
| 38 |
| 29 function func(primitive, elem) { | 39 function func(primitive, elem) { |
| 30 return [primitive, elem.querySelector('div')]; | 40 return [primitive, elem.querySelector('div')]; |
| 31 } | 41 } |
| 32 var cache = getPageCache(); | 42 var result = callFunction(func, [1, wrap(document)]); |
| 33 var result = callFunction(func, [1, cache.wrap(document)]); | |
| 34 assertEquals(0, result.status); | 43 assertEquals(0, result.status); |
| 35 assertEquals(1, result.value[0]); | 44 assertEquals(1, result.value[0]); |
| 36 assertEquals(document.querySelector('div'), cache.unwrap(result.value[1])); | 45 var cache = getPageCache(); |
| 46 assertEquals(document.querySelector('div'), unwrap(result.value[1], cache)); |
| 37 } | 47 } |
| 38 | 48 |
| 39 function testCallFunctionArgsUnwrappedReturn() { | 49 function testCallFunctionArgsUnwrappedReturn() { |
| 50 clearCache(); |
| 51 |
| 40 function func(elem) { | 52 function func(elem) { |
| 41 return elem.querySelector('div'); | 53 return elem.querySelector('div'); |
| 42 } | 54 } |
| 43 var cache = getPageCache(); | 55 var result = callFunction(func, [wrap(document)], true); |
| 44 var result = callFunction(func, [cache.wrap(document)], true); | |
| 45 assertEquals(document.querySelector('div'), result); | 56 assertEquals(document.querySelector('div'), result); |
| 46 } | 57 } |
| 47 | 58 |
| 48 function testCacheWrap() { | 59 function testCacheWrap() { |
| 49 var cache = new Cache(); | 60 clearCache(); |
| 50 assertEquals(1, cache.wrap(1)); | 61 |
| 51 assertEquals(1, cache.unwrap(1)); | 62 assertEquals(1, wrap(1)); |
| 52 assertEquals("1", cache.wrap("1")); | 63 assertEquals(1, unwrap(1)); |
| 53 assertEquals("1", cache.unwrap("1")); | 64 assertEquals("1", wrap("1")); |
| 54 assertEquals(false, cache.wrap(false)); | 65 assertEquals("1", unwrap("1")); |
| 55 assertEquals(false, cache.unwrap(false)); | 66 assertEquals(false, wrap(false)); |
| 56 assertEquals(null, cache.wrap(null)); | 67 assertEquals(false, unwrap(false)); |
| 57 assertEquals(null, cache.unwrap(null)); | 68 assertEquals(null, wrap(null)); |
| 58 assertEquals(undefined, cache.wrap(undefined)); | 69 assertEquals(null, unwrap(null)); |
| 59 assertEquals(undefined, cache.unwrap(undefined)); | 70 assertEquals(undefined, wrap(undefined)); |
| 71 assertEquals(undefined, unwrap(undefined)); |
| 60 function func() {} | 72 function func() {} |
| 61 assertEquals(func, cache.wrap(func)); | 73 assertEquals(func, wrap(func)); |
| 62 assertEquals(func, cache.unwrap(func)); | 74 assertEquals(func, unwrap(func)); |
| 63 | 75 |
| 76 var cache = getPageCache(); |
| 64 var arr = [1, new Array(1, new Object({a: 1, b: {a: 1, b: {}, c: 3}}), 3)]; | 77 var arr = [1, new Array(1, new Object({a: 1, b: {a: 1, b: {}, c: 3}}), 3)]; |
| 65 var originalJson = JSON.stringify(arr); | 78 var originalJson = JSON.stringify(arr); |
| 66 arr[1][1].b.b[ELEMENT_KEY] = cache.nextId_.toString(); | 79 arr[1][1].b.b[ELEMENT_KEY] = cache.idPrefix_ + ':' + cache.nextId_; |
| 67 var wrappedJson = JSON.stringify(arr); | 80 var wrappedJson = JSON.stringify(arr); |
| 68 arr[1][1].b.b = document; | 81 arr[1][1].b.b = document; |
| 69 assertEquals(wrappedJson, JSON.stringify(cache.wrap(arr))); | 82 assertEquals(wrappedJson, JSON.stringify(wrap(arr))); |
| 70 var unwrapped = cache.unwrap(JSON.parse(wrappedJson)); | 83 var unwrapped = unwrap(JSON.parse(wrappedJson), cache); |
| 71 assertEquals(document, unwrapped[1][1].b.b); | 84 assertEquals(document, unwrapped[1][1].b.b); |
| 72 unwrapped[1][1].b.b = {}; | 85 unwrapped[1][1].b.b = {}; |
| 73 assertEquals(originalJson, JSON.stringify(unwrapped)); | 86 assertEquals(originalJson, JSON.stringify(unwrapped)); |
| 74 } | 87 } |
| 75 | 88 |
| 76 function testCacheDoubleWrap() { | 89 function testCacheDoubleWrap() { |
| 77 var cache = new Cache(); | 90 clearCache(); |
| 78 assertEquals(cache.wrap(document)[ELEMENT_KEY], | 91 |
| 79 cache.wrap(document)[ELEMENT_KEY]); | 92 assertEquals(wrap(document)[ELEMENT_KEY], wrap(document)[ELEMENT_KEY]); |
| 80 } | 93 } |
| 81 | 94 |
| 82 function testCacheUnwrapThrows() { | 95 function testCacheUnwrapThrows() { |
| 96 clearCache(); |
| 97 |
| 83 try { | 98 try { |
| 84 var cache = new Cache(); | |
| 85 var wrapped = {}; | 99 var wrapped = {}; |
| 86 wrapped[ELEMENT_KEY] = '1'; | 100 wrapped[ELEMENT_KEY] = '1'; |
| 87 cache.unwrap(wrapped); | 101 unwrap(wrapped, getPageCache()); |
| 102 assert(false); |
| 88 } catch (e) { | 103 } catch (e) { |
| 89 return; | |
| 90 } | 104 } |
| 91 assert(false); | |
| 92 } | 105 } |
| 93 | 106 |
| 94 function testClearStale() { | 107 function testClearStale() { |
| 108 clearCache(); |
| 109 |
| 95 var doc = document; | 110 var doc = document; |
| 96 var div = doc.querySelector('div'); | 111 var div = doc.querySelector('div'); |
| 97 var span = doc.querySelector('span'); | 112 var span = doc.querySelector('span'); |
| 98 | 113 |
| 99 var cache = new Cache(); | 114 var wrappedDoc = wrap(doc); |
| 100 var wrappedDoc = cache.wrap(doc); | 115 var wrappedDiv = wrap(div); |
| 101 var wrappedDiv = cache.wrap(div); | 116 var wrappedSpan = wrap(span); |
| 102 var wrappedSpan = cache.wrap(span); | |
| 103 | 117 |
| 118 var cache = getPageCache(); |
| 104 cache.clearStale(); | 119 cache.clearStale(); |
| 105 assertEquals(doc, cache.unwrap(wrappedDoc)); | 120 assertEquals(doc, unwrap(wrappedDoc, cache)); |
| 106 assertEquals(div, cache.unwrap(wrappedDiv)); | 121 assertEquals(div, unwrap(wrappedDiv, cache)); |
| 107 assertEquals(span, cache.unwrap(wrappedSpan)); | 122 assertEquals(span, unwrap(wrappedSpan, cache)); |
| 108 | 123 |
| 109 div.removeChild(span); | 124 div.removeChild(span); |
| 110 cache.clearStale(); | 125 cache.clearStale(); |
| 111 assertEquals(doc, cache.unwrap(wrappedDoc)); | 126 assertEquals(doc, unwrap(wrappedDoc, cache)); |
| 112 assertEquals(div, cache.unwrap(wrappedDiv)); | 127 assertEquals(div, unwrap(wrappedDiv, cache)); |
| 113 try { | 128 try { |
| 114 cache.unwrap(wrappedSpan); | 129 unwrap(wrappedSpan, cache); |
| 130 assert(false); |
| 115 } catch (e) { | 131 } catch (e) { |
| 116 return; | |
| 117 } | 132 } |
| 118 assert(false); | |
| 119 } | 133 } |
| 120 | 134 |
| 121 function testCacheQuerySelector() { | 135 function testCacheQuerySelector() { |
| 122 var cache = new Cache(); | 136 clearCache(); |
| 137 |
| 138 var cache = getPageCache(); |
| 123 assertEquals(document.querySelector('div'), | 139 assertEquals(document.querySelector('div'), |
| 124 cache.unwrap(cache.wrap(document.querySelector('div')))); | 140 unwrap(wrap(document.querySelector('div')), cache)); |
| 125 assertEquals(document.querySelectorAll('div')[0], | 141 assertEquals(document.querySelectorAll('div')[0], |
| 126 cache.unwrap(cache.wrap(document.querySelectorAll('div')))[0]); | 142 unwrap(wrap(document.querySelectorAll('div')), cache)[0]); |
| 127 } | 143 } |
| 128 | 144 |
| 129 function testCacheStaleRef() { | 145 function testCacheStaleRef() { |
| 130 var cache = new Cache(); | 146 clearCache(); |
| 147 |
| 148 var cache = getPageCache(); |
| 131 var img = document.createElement('img'); | 149 var img = document.createElement('img'); |
| 132 document.body.appendChild(img); | 150 document.body.appendChild(img); |
| 133 var wrappedImg = cache.wrap(img); | 151 var wrappedImg = wrap(img); |
| 134 document.body.removeChild(img); | 152 document.body.removeChild(img); |
| 135 cache.clearStale(); | 153 cache.clearStale(); |
| 136 try { | 154 try { |
| 137 cache.unwrap(wrappedImg); | 155 unwrap(wrappedImg, cache); |
| 156 assert(false); |
| 138 } catch (e) { | 157 } catch (e) { |
| 139 assertEquals(StatusCode.STALE_ELEMENT_REFERENCE, e.code); | 158 assertEquals(StatusCode.STALE_ELEMENT_REFERENCE, e.code); |
| 140 return; | |
| 141 } | 159 } |
| 142 assert(false); | |
| 143 } | 160 } |
| 144 | 161 |
| 145 </script> | 162 </script> |
| 146 <body> | 163 <body> |
| 147 <div><span></span></div> | 164 <div><span></span></div> |
| 148 </body> | 165 </body> |
| 149 </html> | 166 </html> |
| OLD | NEW |