1
+ <!doctype html>
2
+ <!--
3
+ @license
4
+ Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
5
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
6
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
7
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
8
+ Code distributed by Google as part of the polymer project is also
9
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
10
+ -->
11
+ < html dir ="rtl ">
12
+ < head >
13
+ < script src ="../../../webcomponentsjs/webcomponents-lite.js "> </ script >
14
+ < script src ="../../../web-component-tester/browser.js "> </ script >
15
+ < link rel ="import " href ="../../polymer.html ">
16
+ </ head >
17
+ < body >
18
+ <!--
19
+ Issues
20
+ 1. regex will process entire string, including comments and properties, not just selectors...
21
+ 2. complex selectors. not ok... e.g.
22
+ bad: .special > *:dir(rtl)
23
+ but ok: .special:dir(rtl) > *
24
+ 3. multiple selectors per line? ok.
25
+ -->
26
+ < dom-module id ="x-inner-dir ">
27
+ < template >
28
+ < style >
29
+ : host {
30
+ dis play: block;
31
+ height: 20px;
32
+ color : white;
33
+ }
34
+ input, section {
35
+ bor der- to p- width: 0px;
36
+ }
37
+
38
+ section: dir(rtl ), input : dir (rtl ) {
39
+ border : 10px solid rgb (123 , 123 , 123 );
40
+ }
41
+
42
+ .special : dir (rtl ) > * {
43
+ color : rgb (0 , 128 , 0 );
44
+ }
45
+ </ style >
46
+ < div > no rtl styling</ div >
47
+ < section > rtl styling</ section >
48
+ < input value ="rtl styling ">
49
+ < div class ="special ">
50
+ < div > at the right.</ div >
51
+ </ div >
52
+ </ template >
53
+ < script >
54
+ addEventListener ( 'WebComponentsReady' , function ( ) {
55
+ Polymer ( { is : 'x-inner-dir' } ) ;
56
+ } ) ;
57
+ </ script >
58
+ </ dom-module >
59
+
60
+ < dom-module id ="x-dir ">
61
+ < template >
62
+ < style >
63
+ : host {
64
+ dis play: block;
65
+ background- color : rgb(0, 0, 255);
66
+ min- height: 100px;
67
+ width: 100px;
68
+ }
69
+ : host (: dir(rtl)) {
70
+ background-color : rgb (0 , 128 , 0 );
71
+ }
72
+ # foo : dir (rtl ) {
73
+ border : 10px solid rgb (255 , 0 , 0 );
74
+ }
75
+ .thing : dir (rtl ) {
76
+ border : 10px solid rgb (0 , 0 , 255 );
77
+ }
78
+ </ style >
79
+ < div id ="foo "> </ div >
80
+ < div class ="thing "> </ div >
81
+ < x-inner-dir > </ x-inner-dir >
82
+ </ template >
83
+ < script >
84
+ addEventListener ( 'WebComponentsReady' , function ( ) {
85
+ Polymer ( { is : 'x-dir' } ) ;
86
+ } ) ;
87
+ </ script >
88
+ </ dom-module >
89
+
90
+ < test-fixture id ="dir ">
91
+ < template >
92
+ < x-dir > </ x-dir >
93
+ </ template >
94
+ </ test-fixture >
95
+
96
+ < test-fixture id ="preset ">
97
+ < template >
98
+ < x-inner-dir dir ="ltr "> </ x-inner-dir >
99
+ </ template >
100
+ </ test-fixture >
101
+
102
+ < script >
103
+ function assertComputed ( node , expected , property ) {
104
+ property = property || 'border-top-width' ;
105
+ var actual = getComputedStyle ( node ) . getPropertyValue ( property ) . trim ( ) ;
106
+ assert . equal ( expected , actual ) ;
107
+ }
108
+
109
+ suite ( ':dir' , function ( ) {
110
+ teardown ( function ( ) {
111
+ document . documentElement . setAttribute ( 'dir' , 'rtl' ) ;
112
+ } ) ;
113
+
114
+ test ( ':dir(rtl) functions when html element dir attr set to rtl' , function ( ) {
115
+ var el = fixture ( 'dir' ) ;
116
+ var elRoot = Polymer . dom ( el . root ) ;
117
+ assertComputed ( el , 'rgb(0, 128, 0)' , 'background-color' ) ;
118
+ assertComputed ( elRoot . querySelector ( '#foo' ) , '10px' ) ;
119
+ assertComputed ( elRoot . querySelector ( '.thing' ) , '10px' ) ;
120
+ var inner = elRoot . querySelector ( 'x-inner-dir' ) ;
121
+ var innerRoot = Polymer . dom ( inner . root ) ;
122
+ assertComputed ( innerRoot . querySelector ( '.special > div' ) , 'rgb(0, 128, 0)' , 'color' ) ;
123
+ assertComputed ( innerRoot . querySelector ( 'section' ) , '10px' ) ;
124
+ assertComputed ( innerRoot . querySelector ( 'input' ) , '10px' ) ;
125
+ } ) ;
126
+
127
+ test ( ':dir reacts to html attribute changing' , function ( done ) {
128
+ var el = fixture ( 'dir' ) ;
129
+ var elRoot = Polymer . dom ( el . root ) ;
130
+ document . documentElement . setAttribute ( 'dir' , 'ltr' ) ;
131
+ requestAnimationFrame ( function ( ) {
132
+ assertComputed ( el , 'rgb(0, 0, 255)' , 'background-color' ) ;
133
+ assertComputed ( elRoot . querySelector ( '#foo' ) , '0px' ) ;
134
+ assertComputed ( elRoot . querySelector ( '.thing' ) , '0px' ) ;
135
+ var inner = elRoot . querySelector ( 'x-inner-dir' ) ;
136
+ var innerRoot = Polymer . dom ( inner . root ) ;
137
+ assertComputed ( innerRoot . querySelector ( '.special > div' ) , 'rgb(255, 255, 255)' , 'color' ) ;
138
+ assertComputed ( innerRoot . querySelector ( 'section' ) , '0px' ) ;
139
+ assertComputed ( innerRoot . querySelector ( 'input' ) , '0px' ) ;
140
+ done ( ) ;
141
+ } ) ;
142
+ } ) ;
143
+
144
+ test ( 'elements with dir attribute explicitly set will not change' , function ( ) {
145
+ this . skip ( ) ;
146
+ var inner = fixture ( 'preset' ) ;
147
+ var innerRoot = Polymer . dom ( inner . root ) ;
148
+ assert . equal ( document . documentElement . getAttribute ( 'dir' ) , 'rtl' ) ;
149
+ assertComputed ( innerRoot . querySelector ( '.special > div' ) , 'rgb(255, 255, 255)' , 'color' ) ;
150
+ assertComputed ( innerRoot . querySelector ( 'section' ) , '0px' ) ;
151
+ assertComputed ( innerRoot . querySelector ( 'input' ) , '0px' ) ;
152
+ } ) ;
153
+
154
+ test ( 'elements will adopt dir status when reconnected' , function ( done ) {
155
+ var el = fixture ( 'dir' ) ;
156
+ assertComputed ( el , 'rgb(0, 128, 0)' , 'background-color' ) ;
157
+ var parent = el . parentNode ;
158
+ parent . removeChild ( el ) ;
159
+ document . documentElement . setAttribute ( 'dir' , 'ltr' ) ;
160
+ requestAnimationFrame ( function ( ) {
161
+ parent . appendChild ( el ) ;
162
+ requestAnimationFrame ( function ( ) {
163
+ assertComputed ( el , 'rgb(0, 0, 255)' , 'background-color' ) ;
164
+ done ( ) ;
165
+ } ) ;
166
+ } ) ;
167
+ } ) ;
168
+ } ) ;
169
+ </ script >
170
+ </ body >
171
+ </ html >
0 commit comments