Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 4e702e5

Browse filesBrowse files
committed
Implement breakpoints in paramters with destructuring binding pattern
1 parent 73498e8 commit 4e702e5
Copy full SHA for 4e702e5

9 files changed

+59-120Lines changed: 59 additions & 120 deletions
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎src/services/breakpoints.ts‎

Copy file name to clipboardExpand all lines: src/services/breakpoints.ts
+17-7Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,15 @@ namespace ts.BreakpointResolver {
287287
return spanInPreviousNode(node);
288288
}
289289

290-
// initializer of variable declaration go to previous node
291-
if (node.parent.kind === SyntaxKind.VariableDeclaration &&
292-
((<VariableDeclaration>node.parent).initializer === node ||
293-
isAssignmentOperator(node.kind))) {
294-
return spanInPreviousNode(node);
290+
// initializer of variable/parameter declaration go to previous node
291+
if ((node.parent.kind === SyntaxKind.VariableDeclaration ||
292+
node.parent.kind === SyntaxKind.Parameter)) {
293+
const paramOrVarDecl = <VariableDeclaration | ParameterDeclaration>node.parent;
294+
if (paramOrVarDecl.initializer === node ||
295+
paramOrVarDecl.type === node ||
296+
isAssignmentOperator(node.kind)) {
297+
return spanInPreviousNode(node);
298+
}
295299
}
296300

297301
// Default go to parent to set the breakpoint
@@ -345,7 +349,11 @@ namespace ts.BreakpointResolver {
345349
}
346350

347351
function spanInParameterDeclaration(parameter: ParameterDeclaration): TextSpan {
348-
if (canHaveSpanInParameterDeclaration(parameter)) {
352+
if (isBindingPattern(parameter.name)) {
353+
// set breakpoint in binding pattern
354+
return spanInBindingPattern(<BindingPattern>parameter.name);
355+
}
356+
else if (canHaveSpanInParameterDeclaration(parameter)) {
349357
return textSpan(parameter);
350358
}
351359
else {
@@ -562,7 +570,9 @@ namespace ts.BreakpointResolver {
562570

563571
function spanInColonToken(node: Node): TextSpan {
564572
// Is this : specifying return annotation of the function declaration
565-
if (isFunctionLike(node.parent) || node.parent.kind === SyntaxKind.PropertyAssignment) {
573+
if (isFunctionLike(node.parent) ||
574+
node.parent.kind === SyntaxKind.PropertyAssignment ||
575+
node.parent.kind === SyntaxKind.Parameter) {
566576
return spanInPreviousNode(node);
567577
}
568578

Collapse file

‎tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPattern.baseline‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPattern.baseline
+8-8Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
>:=> (line 7, col 4) to (line 7, col 22)
2929
6 >function foo1([, nameA]: Robot) {
3030

31-
~~~~~~~~~ => Pos: (147 to 155) SpanInfo: {"start":150,"length":5}
31+
~~~~~~~~~~~~~~~~~ => Pos: (147 to 163) SpanInfo: {"start":150,"length":5}
3232
>nameA
3333
>:=> (line 6, col 17) to (line 6, col 22)
3434
6 >function foo1([, nameA]: Robot) {
3535

36-
~~~~~~~~~~~ => Pos: (156 to 166) SpanInfo: {"start":171,"length":18}
36+
~~~ => Pos: (164 to 166) SpanInfo: {"start":171,"length":18}
3737
>console.log(nameA)
3838
>:=> (line 7, col 4) to (line 7, col 22)
3939
--------------------------------
@@ -56,12 +56,12 @@
5656
>:=> (line 10, col 4) to (line 10, col 24)
5757
9 >function foo2([numberB]: Robot) {
5858

59-
~~~~~~~~~ => Pos: (207 to 215) SpanInfo: {"start":208,"length":7}
59+
~~~~~~~~~~~~~~~~~ => Pos: (207 to 223) SpanInfo: {"start":208,"length":7}
6060
>numberB
6161
>:=> (line 9, col 15) to (line 9, col 22)
6262
9 >function foo2([numberB]: Robot) {
6363

64-
~~~~~~~~~~~ => Pos: (216 to 226) SpanInfo: {"start":231,"length":20}
64+
~~~ => Pos: (224 to 226) SpanInfo: {"start":231,"length":20}
6565
>console.log(numberB)
6666
>:=> (line 10, col 4) to (line 10, col 24)
6767
--------------------------------
@@ -94,12 +94,12 @@
9494
>:=> (line 12, col 25) to (line 12, col 31)
9595
12 >function foo3([numberA2, nameA2, skillA2]: Robot) {
9696

97-
~~~~~~~~~ => Pos: (287 to 295) SpanInfo: {"start":288,"length":7}
97+
~~~~~~~~~~~~~~~~~=> Pos: (287 to 303) SpanInfo: {"start":288,"length":7}
9898
>skillA2
9999
>:=> (line 12, col 33) to (line 12, col 40)
100100
12 >function foo3([numberA2, nameA2, skillA2]: Robot) {
101101

102-
~~~~~~~~~~~=> Pos: (296 to 306) SpanInfo: {"start":311,"length":19}
102+
~~~=> Pos: (304 to 306) SpanInfo: {"start":311,"length":19}
103103
>console.log(nameA2)
104104
>:=> (line 13, col 4) to (line 13, col 23)
105105
--------------------------------
@@ -127,12 +127,12 @@
127127
>:=> (line 15, col 15) to (line 15, col 23)
128128
15 >function foo4([numberA3, ...robotAInfo]: Robot) {
129129

130-
~~~~~~~~~~~~~~~ => Pos: (358 to 372) SpanInfo: {"start":359,"length":13}
130+
~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (358 to 380) SpanInfo: {"start":359,"length":13}
131131
>...robotAInfo
132132
>:=> (line 15, col 25) to (line 15, col 38)
133133
15 >function foo4([numberA3, ...robotAInfo]: Robot) {
134134

135-
~~~~~~~~~~~=> Pos: (373 to 383) SpanInfo: {"start":388,"length":23}
135+
~~~=> Pos: (381 to 383) SpanInfo: {"start":388,"length":23}
136136
>console.log(robotAInfo)
137137
>:=> (line 16, col 4) to (line 16, col 27)
138138
--------------------------------
Collapse file

‎tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPattern2.baseline‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPattern2.baseline
+8-8Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
>:=> (line 7, col 4) to (line 7, col 23)
2929
6 >function foo1([, skillA]: Robot) {
3030

31-
~~~~~~~~~~ => Pos: (162 to 171) SpanInfo: {"start":165,"length":6}
31+
~~~~~~~~~~~~~~~~~~ => Pos: (162 to 179) SpanInfo: {"start":165,"length":6}
3232
>skillA
3333
>:=> (line 6, col 17) to (line 6, col 23)
3434
6 >function foo1([, skillA]: Robot) {
3535

36-
~~~~~~~~~~~ => Pos: (172 to 182) SpanInfo: {"start":187,"length":19}
36+
~~~ => Pos: (180 to 182) SpanInfo: {"start":187,"length":19}
3737
>console.log(skillA)
3838
>:=> (line 7, col 4) to (line 7, col 23)
3939
--------------------------------
@@ -56,12 +56,12 @@
5656
>:=> (line 10, col 4) to (line 10, col 23)
5757
9 >function foo2([nameMB]: Robot) {
5858

59-
~~~~~~~~ => Pos: (224 to 231) SpanInfo: {"start":225,"length":6}
59+
~~~~~~~~~~~~~~~~ => Pos: (224 to 239) SpanInfo: {"start":225,"length":6}
6060
>nameMB
6161
>:=> (line 9, col 15) to (line 9, col 21)
6262
9 >function foo2([nameMB]: Robot) {
6363

64-
~~~~~~~~~~~ => Pos: (232 to 242) SpanInfo: {"start":247,"length":19}
64+
~~~ => Pos: (240 to 242) SpanInfo: {"start":247,"length":19}
6565
>console.log(nameMB)
6666
>:=> (line 10, col 4) to (line 10, col 23)
6767
--------------------------------
@@ -99,12 +99,12 @@
9999
>:=> (line 12, col 39) to (line 12, col 54)
100100
12 >function foo3([nameMA, [primarySkillA, secondarySkillA]]: Robot) {
101101

102-
~=> Pos: (325 to 325) SpanInfo: {"start":293,"length":32}
102+
~~~~~~~~~=> Pos: (325 to 333) SpanInfo: {"start":293,"length":32}
103103
>[primarySkillA, secondarySkillA]
104104
>:=> (line 12, col 23) to (line 12, col 55)
105105
12 >function foo3([nameMA, [primarySkillA, secondarySkillA]]: Robot) {
106106

107-
~~~~~~~~~~~=> Pos: (326 to 336) SpanInfo: {"start":341,"length":19}
107+
~~~=> Pos: (334 to 336) SpanInfo: {"start":341,"length":19}
108108
>console.log(nameMA)
109109
>:=> (line 13, col 4) to (line 13, col 23)
110110
--------------------------------
@@ -127,12 +127,12 @@
127127
>:=> (line 16, col 4) to (line 16, col 32)
128128
15 >function foo4([...multiRobotAInfo]: Robot) {
129129

130-
~~~~~~~~~~~~~~~~~~~~ => Pos: (378 to 397) SpanInfo: {"start":379,"length":18}
130+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (378 to 405) SpanInfo: {"start":379,"length":18}
131131
>...multiRobotAInfo
132132
>:=> (line 15, col 15) to (line 15, col 33)
133133
15 >function foo4([...multiRobotAInfo]: Robot) {
134134

135-
~~~~~~~~~~~ => Pos: (398 to 408) SpanInfo: {"start":413,"length":28}
135+
~~~ => Pos: (406 to 408) SpanInfo: {"start":413,"length":28}
136136
>console.log(multiRobotAInfo)
137137
>:=> (line 16, col 4) to (line 16, col 32)
138138
--------------------------------
Collapse file

‎tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPatternDefaultValues.baseline‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPatternDefaultValues.baseline
+4-24Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,11 @@
2828
>:=> (line 7, col 4) to (line 7, col 22)
2929
6 >function foo1([, nameA = "noName"]: Robot = [-1, "name", "skill"]) {
3030

31-
~~~~~~~~~~~~~~~~~~~~ => Pos: (147 to 166) SpanInfo: {"start":150,"length":16}
31+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (147 to 198) SpanInfo: {"start":150,"length":16}
3232
>nameA = "noName"
3333
>:=> (line 6, col 17) to (line 6, col 33)
3434
6 >function foo1([, nameA = "noName"]: Robot = [-1, "name", "skill"]) {
3535

36-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (167 to 198) SpanInfo: {"start":147,"length":51}
37-
>[, nameA = "noName"]: Robot = [-1, "name", "skill"]
38-
>:=> (line 6, col 14) to (line 6, col 65)
39-
6 >function foo1([, nameA = "noName"]: Robot = [-1, "name", "skill"]) {
40-
4136
~~~=> Pos: (199 to 201) SpanInfo: {"start":206,"length":18}
4237
>console.log(nameA)
4338
>:=> (line 7, col 4) to (line 7, col 22)
@@ -61,16 +56,11 @@
6156
>:=> (line 10, col 4) to (line 10, col 24)
6257
9 >function foo2([numberB = -1]: Robot = [-1, "name", "skill"]) {
6358

64-
~~~~~~~~~~~~~~ => Pos: (242 to 255) SpanInfo: {"start":243,"length":12}
59+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (242 to 287) SpanInfo: {"start":243,"length":12}
6560
>numberB = -1
6661
>:=> (line 9, col 15) to (line 9, col 27)
6762
9 >function foo2([numberB = -1]: Robot = [-1, "name", "skill"]) {
6863

69-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (256 to 287) SpanInfo: {"start":242,"length":45}
70-
>[numberB = -1]: Robot = [-1, "name", "skill"]
71-
>:=> (line 9, col 14) to (line 9, col 59)
72-
9 >function foo2([numberB = -1]: Robot = [-1, "name", "skill"]) {
73-
7464
~~~=> Pos: (288 to 290) SpanInfo: {"start":295,"length":20}
7565
>console.log(numberB)
7666
>:=> (line 10, col 4) to (line 10, col 24)
@@ -104,16 +94,11 @@
10494
>:=> (line 12, col 30) to (line 12, col 45)
10595
12 >function foo3([numberA2 = -1, nameA2 = "name", skillA2 = "skill"]: Robot = [-1, "name", "skill"]) {
10696

107-
~~~~~~~~~~~~~~~~~~~=> Pos: (365 to 383) SpanInfo: {"start":366,"length":17}
97+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (365 to 415) SpanInfo: {"start":366,"length":17}
10898
>skillA2 = "skill"
10999
>:=> (line 12, col 47) to (line 12, col 64)
110100
12 >function foo3([numberA2 = -1, nameA2 = "name", skillA2 = "skill"]: Robot = [-1, "name", "skill"]) {
111101

112-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (384 to 415) SpanInfo: {"start":333,"length":82}
113-
>[numberA2 = -1, nameA2 = "name", skillA2 = "skill"]: Robot = [-1, "name", "skill"]
114-
>:=> (line 12, col 14) to (line 12, col 96)
115-
12 >function foo3([numberA2 = -1, nameA2 = "name", skillA2 = "skill"]: Robot = [-1, "name", "skill"]) {
116-
117102
~~~=> Pos: (416 to 418) SpanInfo: {"start":423,"length":19}
118103
>console.log(nameA2)
119104
>:=> (line 13, col 4) to (line 13, col 23)
@@ -142,16 +127,11 @@
142127
>:=> (line 15, col 15) to (line 15, col 28)
143128
15 >function foo4([numberA3 = -1, ...robotAInfo]: Robot = [-1, "name", "skill"]) {
144129

145-
~~~~~~~~~~~~~~~ => Pos: (475 to 489) SpanInfo: {"start":476,"length":13}
130+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (475 to 521) SpanInfo: {"start":476,"length":13}
146131
>...robotAInfo
147132
>:=> (line 15, col 30) to (line 15, col 43)
148133
15 >function foo4([numberA3 = -1, ...robotAInfo]: Robot = [-1, "name", "skill"]) {
149134

150-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (490 to 521) SpanInfo: {"start":460,"length":61}
151-
>[numberA3 = -1, ...robotAInfo]: Robot = [-1, "name", "skill"]
152-
>:=> (line 15, col 14) to (line 15, col 75)
153-
15 >function foo4([numberA3 = -1, ...robotAInfo]: Robot = [-1, "name", "skill"]) {
154-
155135
~~~=> Pos: (522 to 524) SpanInfo: {"start":529,"length":23}
156136
>console.log(robotAInfo)
157137
>:=> (line 16, col 4) to (line 16, col 27)
Collapse file

‎tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPatternDefaultValues2.baseline‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/bpSpanDestructuringParameterArrayBindingPatternDefaultValues2.baseline
+4-14Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,11 @@
2828
>:=> (line 7, col 4) to (line 7, col 23)
2929
6 >function foo1([, skillA = ["noSkill", "noSkill"]]: Robot= ["name", ["skill1", "skill2"]]) {
3030

31-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (154 to 188) SpanInfo: {"start":157,"length":31}
31+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (154 to 228) SpanInfo: {"start":157,"length":31}
3232
>skillA = ["noSkill", "noSkill"]
3333
>:=> (line 6, col 17) to (line 6, col 48)
3434
6 >function foo1([, skillA = ["noSkill", "noSkill"]]: Robot= ["name", ["skill1", "skill2"]]) {
3535

36-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (189 to 228) SpanInfo: {"start":154,"length":74}
37-
>[, skillA = ["noSkill", "noSkill"]]: Robot= ["name", ["skill1", "skill2"]]
38-
>:=> (line 6, col 14) to (line 6, col 88)
39-
6 >function foo1([, skillA = ["noSkill", "noSkill"]]: Robot= ["name", ["skill1", "skill2"]]) {
40-
4136
~~~=> Pos: (229 to 231) SpanInfo: {"start":236,"length":19}
4237
>console.log(skillA)
4338
>:=> (line 7, col 4) to (line 7, col 23)
@@ -61,16 +56,11 @@
6156
>:=> (line 10, col 4) to (line 10, col 23)
6257
9 >function foo2([nameMB = "noName"]: Robot = ["name", ["skill1", "skill2"]]) {
6358

64-
~~~~~~~~~~~~~~~~~~~ => Pos: (273 to 291) SpanInfo: {"start":274,"length":17}
59+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (273 to 332) SpanInfo: {"start":274,"length":17}
6560
>nameMB = "noName"
6661
>:=> (line 9, col 15) to (line 9, col 32)
6762
9 >function foo2([nameMB = "noName"]: Robot = ["name", ["skill1", "skill2"]]) {
6863

69-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=> Pos: (292 to 332) SpanInfo: {"start":273,"length":59}
70-
>[nameMB = "noName"]: Robot = ["name", ["skill1", "skill2"]]
71-
>:=> (line 9, col 14) to (line 9, col 73)
72-
9 >function foo2([nameMB = "noName"]: Robot = ["name", ["skill1", "skill2"]]) {
73-
7464
~~~=> Pos: (333 to 335) SpanInfo: {"start":340,"length":19}
7565
>console.log(nameMB)
7666
>:=> (line 10, col 4) to (line 10, col 23)
@@ -122,15 +112,15 @@
122112
>:=> (line 14, col 4) to (line 14, col 33)
123113
15 >] = ["noSkill", "noSkill"]]: Robot) {
124114

125-
~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (465 to 490) SpanInfo: {"start":397,"length":93}
115+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ => Pos: (465 to 498) SpanInfo: {"start":397,"length":93}
126116
>[
127117
> primarySkillA = "primary",
128118
> secondarySkillA = "secondary"
129119
>] = ["noSkill", "noSkill"]
130120
>:=> (line 12, col 34) to (line 15, col 26)
131121
15 >] = ["noSkill", "noSkill"]]: Robot) {
132122

133-
~~~~~~~~~~~ => Pos: (491 to 501) SpanInfo: {"start":506,"length":19}
123+
~~~ => Pos: (499 to 501) SpanInfo: {"start":506,"length":19}
134124
>console.log(nameMA)
135125
>:=> (line 16, col 4) to (line 16, col 23)
136126
--------------------------------
Collapse file

‎tests/baselines/reference/bpSpanDestructuringParameterNestedObjectBindingPattern.baseline‎

Copy file name to clipboardExpand all lines: tests/baselines/reference/bpSpanDestructuringParameterNestedObjectBindingPattern.baseline
+6-6Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@
6767
>:=> (line 12, col 45) to (line 12, col 66)
6868
12 >function foo1({ skills: { primary: primaryA, secondary: secondaryA } }: Robot) {
6969

70-
~~=> Pos: (321 to 322) SpanInfo: {"start":269,"length":52}
70+
~~~~~~~~~~=> Pos: (321 to 330) SpanInfo: {"start":269,"length":52}
7171
>skills: { primary: primaryA, secondary: secondaryA }
7272
>:=> (line 12, col 16) to (line 12, col 68)
7373
12 >function foo1({ skills: { primary: primaryA, secondary: secondaryA } }: Robot) {
7474

75-
~~~~~~~~~~~=> Pos: (323 to 333) SpanInfo: {"start":338,"length":21}
75+
~~~=> Pos: (331 to 333) SpanInfo: {"start":338,"length":21}
7676
>console.log(primaryA)
7777
>:=> (line 13, col 4) to (line 13, col 25)
7878
--------------------------------
@@ -115,12 +115,12 @@
115115
>:=> (line 15, col 58) to (line 15, col 79)
116116
15 >function foo2({ name: nameC, skills: { primary: primaryB, secondary: secondaryB } }: Robot) {
117117

118-
~~=> Pos: (444 to 445) SpanInfo: {"start":392,"length":52}
118+
~~~~~~~~~~=> Pos: (444 to 453) SpanInfo: {"start":392,"length":52}
119119
>skills: { primary: primaryB, secondary: secondaryB }
120120
>:=> (line 15, col 29) to (line 15, col 81)
121121
15 >function foo2({ name: nameC, skills: { primary: primaryB, secondary: secondaryB } }: Robot) {
122122

123-
~~~~~~~~~~~=> Pos: (446 to 456) SpanInfo: {"start":461,"length":23}
123+
~~~=> Pos: (454 to 456) SpanInfo: {"start":461,"length":23}
124124
>console.log(secondaryB)
125125
>:=> (line 16, col 4) to (line 16, col 27)
126126
--------------------------------
@@ -143,12 +143,12 @@
143143
>:=> (line 19, col 4) to (line 19, col 31)
144144
18 >function foo3({ skills }: Robot) {
145145

146-
~~~~~~~~~~ => Pos: (502 to 511) SpanInfo: {"start":504,"length":6}
146+
~~~~~~~~~~~~~~~~~~ => Pos: (502 to 519) SpanInfo: {"start":504,"length":6}
147147
>skills
148148
>:=> (line 18, col 16) to (line 18, col 22)
149149
18 >function foo3({ skills }: Robot) {
150150

151-
~~~~~~~~~~~ => Pos: (512 to 522) SpanInfo: {"start":527,"length":27}
151+
~~~ => Pos: (520 to 522) SpanInfo: {"start":527,"length":27}
152152
>console.log(skills.primary)
153153
>:=> (line 19, col 4) to (line 19, col 31)
154154
--------------------------------

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.