ReactOS 0.4.15-dev-8102-g108db8f
htmlstyle.c
Go to the documentation of this file.
1/*
2 * Copyright 2006 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "mshtml_private.h"
20
21static const WCHAR attrBackground[] =
22 {'b','a','c','k','g','r','o','u','n','d',0};
24 {'b','a','c','k','g','r','o','u','n','d','-','a','t','t','a','c','h','m','e','n','t',0};
25static const WCHAR attrBackgroundColor[] =
26 {'b','a','c','k','g','r','o','u','n','d','-','c','o','l','o','r',0};
27static const WCHAR attrBackgroundImage[] =
28 {'b','a','c','k','g','r','o','u','n','d','-','i','m','a','g','e',0};
30 {'b','a','c','k','g','r','o','u','n','d','-','p','o','s','i','t','i','o','n',0};
32 {'b','a','c','k','g','r','o','u','n','d','-','p','o','s','i','t','i','o','n','-','x',0};
34 {'b','a','c','k','g','r','o','u','n','d','-','p','o','s','i','t','i','o','n','-','y',0};
36 {'b','a','c','k','g','r','o','u','n','d','-','r','e','p','e','a','t',0};
37static const WCHAR attrBorder[] =
38 {'b','o','r','d','e','r',0};
39static const WCHAR attrBorderBottom[] =
40 {'b','o','r','d','e','r','-','b','o','t','t','o','m',0};
42 {'b','o','r','d','e','r','-','b','o','t','t','o','m','-','c','o','l','o','r',0};
44 {'b','o','r','d','e','r','-','b','o','t','t','o','m','-','s','t','y','l','e',0};
46 {'b','o','r','d','e','r','-','b','o','t','t','o','m','-','w','i','d','t','h',0};
47static const WCHAR attrBorderColor[] =
48 {'b','o','r','d','e','r','-','c','o','l','o','r',0};
49static const WCHAR attrBorderLeft[] =
50 {'b','o','r','d','e','r','-','l','e','f','t',0};
51static const WCHAR attrBorderLeftColor[] =
52 {'b','o','r','d','e','r','-','l','e','f','t','-','c','o','l','o','r',0};
53static const WCHAR attrBorderLeftStyle[] =
54 {'b','o','r','d','e','r','-','l','e','f','t','-','s','t','y','l','e',0};
55static const WCHAR attrBorderLeftWidth[] =
56 {'b','o','r','d','e','r','-','l','e','f','t','-','w','i','d','t','h',0};
57static const WCHAR attrBorderRight[] =
58 {'b','o','r','d','e','r','-','r','i','g','h','t',0};
60 {'b','o','r','d','e','r','-','r','i','g','h','t','-','c','o','l','o','r',0};
62 {'b','o','r','d','e','r','-','r','i','g','h','t','-','s','t','y','l','e',0};
64 {'b','o','r','d','e','r','-','r','i','g','h','t','-','w','i','d','t','h',0};
65static const WCHAR attrBorderTop[] =
66 {'b','o','r','d','e','r','-','t','o','p',0};
67static const WCHAR attrBorderTopColor[] =
68 {'b','o','r','d','e','r','-','t','o','p','-','c','o','l','o','r',0};
69static const WCHAR attrBorderStyle[] =
70 {'b','o','r','d','e','r','-','s','t','y','l','e',0};
71static const WCHAR attrBorderTopStyle[] =
72 {'b','o','r','d','e','r','-','t','o','p','-','s','t','y','l','e',0};
73static const WCHAR attrBorderTopWidth[] =
74 {'b','o','r','d','e','r','-','t','o','p','-','w','i','d','t','h',0};
75static const WCHAR attrBorderWidth[] =
76 {'b','o','r','d','e','r','-','w','i','d','t','h',0};
77static const WCHAR attrBottom[] =
78 {'b','o','t','t','o','m',0};
79/* FIXME: Use unprefixed version (requires Gecko changes). */
80static const WCHAR attrBoxSizing[] =
81 {'-','m','o','z','-','b','o','x','-','s','i','z','i','n','g',0};
82static const WCHAR attrClear[] =
83 {'c','l','e','a','r',0};
84static const WCHAR attrClip[] =
85 {'c','l','i','p',0};
86static const WCHAR attrColor[] =
87 {'c','o','l','o','r',0};
88static const WCHAR attrCursor[] =
89 {'c','u','r','s','o','r',0};
90static const WCHAR attrDirection[] =
91 {'d','i','r','e','c','t','i','o','n',0};
92static const WCHAR attrDisplay[] =
93 {'d','i','s','p','l','a','y',0};
94static const WCHAR attrFilter[] =
95 {'f','i','l','e','t','e','r',0};
96static const WCHAR attrFloat[] =
97 {'f','l','o','a','t',0};
98static const WCHAR attrFontFamily[] =
99 {'f','o','n','t','-','f','a','m','i','l','y',0};
100static const WCHAR attrFontSize[] =
101 {'f','o','n','t','-','s','i','z','e',0};
102static const WCHAR attrFontStyle[] =
103 {'f','o','n','t','-','s','t','y','l','e',0};
104static const WCHAR attrFontVariant[] =
105 {'f','o','n','t','-','v','a','r','i','a','n','t',0};
106static const WCHAR attrFontWeight[] =
107 {'f','o','n','t','-','w','e','i','g','h','t',0};
108static const WCHAR attrHeight[] =
109 {'h','e','i','g','h','t',0};
110static const WCHAR attrLeft[] =
111 {'l','e','f','t',0};
112static const WCHAR attrLetterSpacing[] =
113 {'l','e','t','t','e','r','-','s','p','a','c','i','n','g',0};
114static const WCHAR attrLineHeight[] =
115 {'l','i','n','e','-','h','e','i','g','h','t',0};
116static const WCHAR attrListStyle[] =
117 {'l','i','s','t','-','s','t','y','l','e',0};
118static const WCHAR attrListStyleType[] =
119 {'l','i','s','t','-','s','t','y','l','e','-','t','y','p','e',0};
121 {'l','i','s','t','-','s','t','y','l','e','-','p','o','s','i','t','i','o','n',0};
122static const WCHAR attrMargin[] =
123 {'m','a','r','g','i','n',0};
124static const WCHAR attrMarginBottom[] =
125 {'m','a','r','g','i','n','-','b','o','t','t','o','m',0};
126static const WCHAR attrMarginLeft[] =
127 {'m','a','r','g','i','n','-','l','e','f','t',0};
128static const WCHAR attrMarginRight[] =
129 {'m','a','r','g','i','n','-','r','i','g','h','t',0};
130static const WCHAR attrMarginTop[] =
131 {'m','a','r','g','i','n','-','t','o','p',0};
132static const WCHAR attrMaxHeight[] =
133 {'m','a','x','-','h','e','i','g','h','t',0};
134static const WCHAR attrMaxWidth[] =
135 {'m','a','x','-','w','i','d','t','h',0};
136static const WCHAR attrMinHeight[] =
137 {'m','i','n','-','h','e','i','g','h','t',0};
138static const WCHAR attrMinWidth[] =
139 {'m','i','n','-','w','i','d','t','h',0};
140static const WCHAR attrOutline[] =
141 {'o','u','t','l','i','n','e',0};
142static const WCHAR attrOverflow[] =
143 {'o','v','e','r','f','l','o','w',0};
144static const WCHAR attrOverflowX[] =
145 {'o','v','e','r','f','l','o','w','-','x',0};
146static const WCHAR attrOverflowY[] =
147 {'o','v','e','r','f','l','o','w','-','y',0};
148static const WCHAR attrPadding[] =
149 {'p','a','d','d','i','n','g',0};
150static const WCHAR attrPaddingBottom[] =
151 {'p','a','d','d','i','n','g','-','b','o','t','t','o','m',0};
152static const WCHAR attrPaddingLeft[] =
153 {'p','a','d','d','i','n','g','-','l','e','f','t',0};
154static const WCHAR attrPaddingRight[] =
155 {'p','a','d','d','i','n','g','-','r','i','g','h','t',0};
156static const WCHAR attrPaddingTop[] =
157 {'p','a','d','d','i','n','g','-','t','o','p',0};
158static const WCHAR attrPageBreakAfter[] =
159 {'p','a','g','e','-','b','r','e','a','k','-','a','f','t','e','r',0};
161 {'p','a','g','e','-','b','r','e','a','k','-','b','e','f','o','r','e',0};
162static const WCHAR attrPosition[] =
163 {'p','o','s','i','t','i','o','n',0};
164static const WCHAR attrRight[] =
165 {'r','i','g','h','t',0};
166static const WCHAR attrTableLayout[] =
167 {'t','a','b','l','e','-','l','a','y','o','u','t',0};
168static const WCHAR attrTextAlign[] =
169 {'t','e','x','t','-','a','l','i','g','n',0};
170static const WCHAR attrTextDecoration[] =
171 {'t','e','x','t','-','d','e','c','o','r','a','t','i','o','n',0};
172static const WCHAR attrTextIndent[] =
173 {'t','e','x','t','-','i','n','d','e','n','t',0};
174static const WCHAR attrTextTransform[] =
175 {'t','e','x','t','-','t','r','a','n','s','f','o','r','m',0};
176static const WCHAR attrTop[] =
177 {'t','o','p',0};
178static const WCHAR attrVerticalAlign[] =
179 {'v','e','r','t','i','c','a','l','-','a','l','i','g','n',0};
180static const WCHAR attrVisibility[] =
181 {'v','i','s','i','b','i','l','i','t','y',0};
182static const WCHAR attrWhiteSpace[] =
183 {'w','h','i','t','e','-','s','p','a','c','e',0};
184static const WCHAR attrWidth[] =
185 {'w','i','d','t','h',0};
186static const WCHAR attrWordSpacing[] =
187 {'w','o','r','d','-','s','p','a','c','i','n','g',0};
188static const WCHAR attrWordWrap[] =
189 {'w','o','r','d','-','w','r','a','p',0};
190static const WCHAR attrZIndex[] =
191 {'z','-','i','n','d','e','x',0};
192
193
194static const WCHAR pxW[] = {'p','x',0};
195
196typedef struct {
197 const WCHAR *name;
200
201static const style_tbl_entry_t style_tbl[] = {
287};
288
290
291static const WCHAR valLineThrough[] =
292 {'l','i','n','e','-','t','h','r','o','u','g','h',0};
293static const WCHAR valUnderline[] =
294 {'u','n','d','e','r','l','i','n','e',0};
295static const WCHAR szNormal[] =
296 {'n','o','r','m','a','l',0};
297static const WCHAR styleNone[] =
298 {'n','o','n','e',0};
299static const WCHAR valOverline[] =
300 {'o','v','e','r','l','i','n','e',0};
301static const WCHAR valBlink[] =
302 {'b','l','i','n','k',0};
303
304static const WCHAR px_formatW[] = {'%','d','p','x',0};
305static const WCHAR emptyW[] = {0};
306
308{
309 int c, i, min = 0, max = sizeof(style_tbl)/sizeof(*style_tbl)-1;
310
311 while(min <= max) {
312 i = (min+max)/2;
313
315 if(!c)
316 return style_tbl+i;
317
318 if(c > 0)
319 max = i-1;
320 else
321 min = i+1;
322 }
323
324 return NULL;
325}
326
328{
329 LPCWSTR ptr = val;
330
331 while(*ptr) {
332 while(*ptr && isspaceW(*ptr))
333 ptr++;
334 if(!*ptr)
335 break;
336
337 while(*ptr && isdigitW(*ptr))
338 ptr++;
339
340 if(!*ptr || isspaceW(*ptr)) {
341 LPWSTR ret, p;
342 int len = strlenW(val)+1;
343
344 ret = heap_alloc((len+2)*sizeof(WCHAR));
345 memcpy(ret, val, (ptr-val)*sizeof(WCHAR));
346 p = ret + (ptr-val);
347 *p++ = 'p';
348 *p++ = 'x';
349 strcpyW(p, ptr);
350
351 TRACE("fixed %s -> %s\n", debugstr_w(val), debugstr_w(ret));
352
353 return ret;
354 }
355
356 while(*ptr && !isspaceW(*ptr))
357 ptr++;
358 }
359
360 return NULL;
361}
362
364{
365 WCHAR *ret, *ptr;
366
367 static const WCHAR urlW[] = {'u','r','l','('};
368
369 if(strncmpW(val, urlW, sizeof(urlW)/sizeof(WCHAR)) || !strchrW(val, '\\'))
370 return NULL;
371
373
374 for(ptr = ret; *ptr; ptr++) {
375 if(*ptr == '\\')
376 *ptr = '/';
377 }
378
379 return ret;
380}
381
383{
384 nsAString str_name, str_value, str_empty;
385 LPWSTR val = NULL;
386 nsresult nsres;
387
388 if(value) {
389 if(flags & ATTR_FIX_PX)
391 else if(flags & ATTR_FIX_URL)
393 }
394
396 nsAString_InitDepend(&str_value, val ? val : value);
397 nsAString_InitDepend(&str_empty, emptyW);
398
399 nsres = nsIDOMCSSStyleDeclaration_SetProperty(nsstyle, &str_name, &str_value, &str_empty);
400 if(NS_FAILED(nsres))
401 ERR("SetProperty failed: %08x\n", nsres);
402
403 nsAString_Finish(&str_name);
404 nsAString_Finish(&str_value);
405 nsAString_Finish(&str_empty);
406 heap_free(val);
407
408 return S_OK;
409}
410
412{
413 switch(V_VT(v)) {
414 case VT_NULL:
415 *ret = emptyW;
416 return S_OK;
417
418 case VT_BSTR:
419 *ret = V_BSTR(v);
420 return S_OK;
421
422 case VT_BSTR|VT_BYREF:
423 *ret = *V_BSTRREF(v);
424 return S_OK;
425
426 case VT_I4: {
427 static const WCHAR formatW[] = {'%','d',0};
428 static const WCHAR hex_formatW[] = {'#','%','0','6','x',0};
429
430 if(flags & ATTR_HEX_INT)
431 wsprintfW(buf, hex_formatW, V_I4(v));
432 else if(flags & ATTR_FIX_PX)
434 else
435 wsprintfW(buf, formatW, V_I4(v));
436
437 *ret = buf;
438 return S_OK;
439 }
440 default:
441 FIXME("not implemented for %s\n", debugstr_variant(v));
442 return E_NOTIMPL;
443
444 }
445}
446
448{
449 const WCHAR *val;
450 WCHAR buf[14];
452
454 if(FAILED(hres))
455 return hres;
456
457 return set_nsstyle_attr(nsstyle, sid, val, flags);
458}
459
461{
462 return set_nsstyle_attr(This->nsstyle, sid, value, flags);
463}
464
466{
467 nsAString str_name;
468 nsresult nsres;
469
471
472 nsres = nsIDOMCSSStyleDeclaration_GetPropertyValue(nsstyle, &str_name, value);
473 if(NS_FAILED(nsres)) {
474 ERR("SetProperty failed: %08x\n", nsres);
475 return E_FAIL;
476 }
477
478 nsAString_Finish(&str_name);
479
480 return NS_OK;
481}
482
484{
485 BSTR ret;
486 DWORD len;
487
488 if(!*val) {
490 return S_OK;
491 }
492
494 if(!ret)
495 return E_OUTOFMEMORY;
496
498
500 DWORD new_len = len;
501 WCHAR *ptr, *ptr2;
502
503 for(ptr = ret; (ptr = strchrW(ptr, ',')); ptr++)
504 new_len--;
505
506 if(new_len != len) {
507 BSTR new_ret;
508
509 new_ret = SysAllocStringLen(NULL, new_len);
510 if(!new_ret) {
512 return E_OUTOFMEMORY;
513 }
514
515 for(ptr2 = new_ret, ptr = ret; *ptr; ptr++) {
516 if(*ptr != ',')
517 *ptr2++ = *ptr;
518 }
519
521 ret = new_ret;
522 }
523 }
524
525 *p = ret;
526 return S_OK;
527}
528
530{
531 nsAString str_value;
532 const PRUnichar *value;
534
535 nsAString_Init(&str_value, NULL);
536
537 get_nsstyle_attr_nsval(nsstyle, sid, &str_value);
538
539 nsAString_GetData(&str_value, &value);
541 nsAString_Finish(&str_value);
542
543 TRACE("%s -> %s\n", debugstr_w(style_tbl[sid].name), debugstr_w(*p));
544 return hres;
545}
546
548{
549 nsAString str_value;
550 const PRUnichar *value;
551 BOOL set = FALSE;
552 HRESULT hres = S_OK;
553
554 nsAString_Init(&str_value, NULL);
555
556 get_nsstyle_attr_nsval(nsstyle, sid, &str_value);
557
558 nsAString_GetData(&str_value, &value);
559
560 if(flags & ATTR_STR_TO_INT) {
561 const PRUnichar *ptr = value;
562 BOOL neg = FALSE;
563 INT i = 0;
564
565 if(*ptr == '-') {
566 neg = TRUE;
567 ptr++;
568 }
569
570 while(isdigitW(*ptr))
571 i = i*10 + (*ptr++ - '0');
572
573 if(!*ptr) {
574 V_VT(p) = VT_I4;
575 V_I4(p) = neg ? -i : i;
576 set = TRUE;
577 }
578 }
579
580 if(!set) {
581 BSTR str;
582
584 if(SUCCEEDED(hres)) {
585 V_VT(p) = VT_BSTR;
586 V_BSTR(p) = str;
587 }
588 }
589
590 nsAString_Finish(&str_value);
591
593 return S_OK;
594}
595
597{
598 return get_nsstyle_attr(This->nsstyle, sid, p, 0);
599}
600
602{
603 nsAString str_value;
604 const PRUnichar *value;
605
606 nsAString_Init(&str_value, NULL);
607
608 get_nsstyle_attr_nsval(This->nsstyle, sid, &str_value);
609
610 nsAString_GetData(&str_value, &value);
611 *p = strcmpW(value, exval) ? VARIANT_FALSE : VARIANT_TRUE;
612 nsAString_Finish(&str_value);
613
614 TRACE("%s -> %x\n", debugstr_w(style_tbl[sid].name), *p);
615 return S_OK;
616}
617
619{
620 WCHAR szValue[25];
621 WCHAR szFormat[] = {'%','.','0','f','p','x',0};
622
623 value = floor(value);
624
625 sprintfW(szValue, szFormat, value);
626
627 return set_style_attr(This, sid, szValue, 0);
628}
629
631{
632 WCHAR value_str[16];
633
635
636 return set_nsstyle_attr(nsstyle, sid, value_str, 0);
637}
638
640{
641 nsAString str_value;
643
644 TRACE("%p %d %p\n", This, sid, p);
645
646 *p = 0.0f;
647
648 nsAString_Init(&str_value, NULL);
649
650 hres = get_nsstyle_attr_nsval(This->nsstyle, sid, &str_value);
651 if(hres == S_OK)
652 {
653 WCHAR *ptr;
654 const PRUnichar *value;
655
656 nsAString_GetData(&str_value, &value);
657 if(value)
658 {
659 *p = strtolW(value, &ptr, 10);
660
661 if(*ptr && strcmpW(ptr, pxW))
662 {
663 nsAString_Finish(&str_value);
664 FIXME("only px values are currently supported\n");
665 hres = E_FAIL;
666 }
667 }
668 }
669
670 TRACE("ret %f\n", *p);
671
672 nsAString_Finish(&str_value);
673 return hres;
674}
675
677{
678 nsAString str_value;
680
681 if(!p)
682 return E_POINTER;
683
684 nsAString_Init(&str_value, NULL);
685
686 hres = get_nsstyle_attr_nsval(This->nsstyle, sid, &str_value);
687 if(hres == S_OK) {
688 WCHAR *ptr;
689 const PRUnichar *value;
690
691 nsAString_GetData(&str_value, &value);
692 if(value) {
693 *p = strtolW(value, &ptr, 10);
694
695 if(*ptr == '.') {
696 /* Skip all digits. We have tests showing that we should not round the value. */
697 while(isdigitW(*++ptr));
698 }
699
700 if(*ptr && strcmpW(ptr, pxW)) {
701 nsAString_Finish(&str_value);
702 FIXME("%s: only px values are currently supported\n", debugstr_w(value));
703 hres = E_NOTIMPL;
704 }
705 }else {
706 *p = 0;
707 }
708 }
709
710 nsAString_Finish(&str_value);
711 return hres;
712}
713
715{
716 static const WCHAR styleDotted[] = {'d','o','t','t','e','d',0};
717 static const WCHAR styleDashed[] = {'d','a','s','h','e','d',0};
718 static const WCHAR styleSolid[] = {'s','o','l','i','d',0};
719 static const WCHAR styleDouble[] = {'d','o','u','b','l','e',0};
720 static const WCHAR styleGroove[] = {'g','r','o','o','v','e',0};
721 static const WCHAR styleRidge[] = {'r','i','d','g','e',0};
722 static const WCHAR styleInset[] = {'i','n','s','e','t',0};
723 static const WCHAR styleOutset[] = {'o','u','t','s','e','t',0};
724
725 TRACE("%s\n", debugstr_w(v));
726
727 if(!v || strcmpiW(v, styleNone) == 0 || strcmpiW(v, styleDotted) == 0 ||
728 strcmpiW(v, styleDashed) == 0 || strcmpiW(v, styleSolid) == 0 ||
729 strcmpiW(v, styleDouble) == 0 || strcmpiW(v, styleGroove) == 0 ||
730 strcmpiW(v, styleRidge) == 0 || strcmpiW(v, styleInset) == 0 ||
731 strcmpiW(v, styleOutset) == 0 )
732 {
733 return TRUE;
734 }
735
736 return FALSE;
737}
738
739static inline HTMLStyle *impl_from_IHTMLStyle(IHTMLStyle *iface)
740{
741 return CONTAINING_RECORD(iface, HTMLStyle, IHTMLStyle_iface);
742}
743
744static HRESULT WINAPI HTMLStyle_QueryInterface(IHTMLStyle *iface, REFIID riid, void **ppv)
745{
747
748 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
749
751 *ppv = &This->IHTMLStyle_iface;
752 }else if(IsEqualGUID(&IID_IHTMLStyle, riid)) {
753 *ppv = &This->IHTMLStyle_iface;
754 }else if(IsEqualGUID(&IID_IHTMLStyle2, riid)) {
755 *ppv = &This->IHTMLStyle2_iface;
756 }else if(IsEqualGUID(&IID_IHTMLStyle3, riid)) {
757 *ppv = &This->IHTMLStyle3_iface;
758 }else if(IsEqualGUID(&IID_IHTMLStyle4, riid)) {
759 *ppv = &This->IHTMLStyle4_iface;
760 }else if(IsEqualGUID(&IID_IHTMLStyle5, riid)) {
761 *ppv = &This->IHTMLStyle5_iface;
762 }else if(IsEqualGUID(&IID_IHTMLStyle6, riid)) {
763 *ppv = &This->IHTMLStyle6_iface;
764 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
765 return *ppv ? S_OK : E_NOINTERFACE;
766 }else {
767 *ppv = NULL;
768 WARN("unsupported iface %s\n", debugstr_mshtml_guid(riid));
769 return E_NOINTERFACE;
770 }
771
772 IUnknown_AddRef((IUnknown*)*ppv);
773 return S_OK;
774}
775
776static ULONG WINAPI HTMLStyle_AddRef(IHTMLStyle *iface)
777{
780
781 TRACE("(%p) ref=%d\n", This, ref);
782
783 return ref;
784}
785
786static ULONG WINAPI HTMLStyle_Release(IHTMLStyle *iface)
787{
790
791 TRACE("(%p) ref=%d\n", This, ref);
792
793 if(!ref) {
794 assert(!This->elem);
795 if(This->nsstyle)
796 nsIDOMCSSStyleDeclaration_Release(This->nsstyle);
797 release_dispex(&This->dispex);
799 }
800
801 return ref;
802}
803
804static HRESULT WINAPI HTMLStyle_GetTypeInfoCount(IHTMLStyle *iface, UINT *pctinfo)
805{
807 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
808}
809
810static HRESULT WINAPI HTMLStyle_GetTypeInfo(IHTMLStyle *iface, UINT iTInfo,
811 LCID lcid, ITypeInfo **ppTInfo)
812{
814 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
815}
816
818 LPOLESTR *rgszNames, UINT cNames,
819 LCID lcid, DISPID *rgDispId)
820{
822 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
823 lcid, rgDispId);
824}
825
826static HRESULT WINAPI HTMLStyle_Invoke(IHTMLStyle *iface, DISPID dispIdMember,
827 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
828 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
829{
831 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
832 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
833}
834
835static HRESULT WINAPI HTMLStyle_put_fontFamily(IHTMLStyle *iface, BSTR v)
836{
838
839 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
840
842}
843
844static HRESULT WINAPI HTMLStyle_get_fontFamily(IHTMLStyle *iface, BSTR *p)
845{
847
848 TRACE("(%p)->(%p)\n", This, p);
849
851}
852
853static HRESULT WINAPI HTMLStyle_put_fontStyle(IHTMLStyle *iface, BSTR v)
854{
856 static const WCHAR szItalic[] = {'i','t','a','l','i','c',0};
857 static const WCHAR szOblique[] = {'o','b','l','i','q','u','e',0};
858
859 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
860
861 /* fontStyle can only be one of the follow values. */
862 if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(szItalic, v) == 0 ||
863 strcmpiW(szOblique, v) == 0)
864 {
865 return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_STYLE, v, 0);
866 }
867
868 return E_INVALIDARG;
869}
870
871static HRESULT WINAPI HTMLStyle_get_fontStyle(IHTMLStyle *iface, BSTR *p)
872{
874
875 TRACE("(%p)->(%p)\n", This, p);
876
878}
879
881{
883 static const WCHAR szCaps[] = {'s','m','a','l','l','-','c','a','p','s',0};
884
885 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
886
887 /* fontVariant can only be one of the follow values. */
888 if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(szCaps, v) == 0)
889 {
890 return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_VARIANT, v, 0);
891 }
892
893 return E_INVALIDARG;
894}
895
896static HRESULT WINAPI HTMLStyle_get_fontVariant(IHTMLStyle *iface, BSTR *p)
897{
899 TRACE("(%p)->(%p)\n", This, p);
900
901 if(!p)
902 return E_INVALIDARG;
903
905}
906
907static HRESULT WINAPI HTMLStyle_put_fontWeight(IHTMLStyle *iface, BSTR v)
908{
910 static const WCHAR styleBold[] = {'b','o','l','d',0};
911 static const WCHAR styleBolder[] = {'b','o','l','d','e','r',0};
912 static const WCHAR styleLighter[] = {'l','i','g','h','t','e','r',0};
913 static const WCHAR style100[] = {'1','0','0',0};
914 static const WCHAR style200[] = {'2','0','0',0};
915 static const WCHAR style300[] = {'3','0','0',0};
916 static const WCHAR style400[] = {'4','0','0',0};
917 static const WCHAR style500[] = {'5','0','0',0};
918 static const WCHAR style600[] = {'6','0','0',0};
919 static const WCHAR style700[] = {'7','0','0',0};
920 static const WCHAR style800[] = {'8','0','0',0};
921 static const WCHAR style900[] = {'9','0','0',0};
922
923 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
924
925 /* fontWeight can only be one of the following */
926 if(v && *v && strcmpiW(szNormal, v) && strcmpiW(styleBold, v) && strcmpiW(styleBolder, v)
927 && strcmpiW(styleLighter, v) && strcmpiW(style100, v) && strcmpiW(style200, v)
928 && strcmpiW(style300, v) && strcmpiW(style400, v) && strcmpiW(style500, v) && strcmpiW(style600, v)
929 && strcmpiW(style700, v) && strcmpiW(style800, v) && strcmpiW(style900, v))
930 return E_INVALIDARG;
931
932 return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_WEIGHT, v, 0);
933}
934
935static HRESULT WINAPI HTMLStyle_get_fontWeight(IHTMLStyle *iface, BSTR *p)
936{
938
939 TRACE("(%p)->(%p)\n", This, p);
940
942}
943
945{
947
948 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
949
951}
952
953static HRESULT WINAPI HTMLStyle_get_fontSize(IHTMLStyle *iface, VARIANT *p)
954{
956
957 TRACE("(%p)->(%p)\n", This, p);
958
959 return get_nsstyle_attr_var(This->nsstyle, STYLEID_FONT_SIZE, p, 0);
960}
961
962static HRESULT WINAPI HTMLStyle_put_font(IHTMLStyle *iface, BSTR v)
963{
965 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
966 return E_NOTIMPL;
967}
968
969static HRESULT WINAPI HTMLStyle_get_font(IHTMLStyle *iface, BSTR *p)
970{
972 FIXME("(%p)->(%p)\n", This, p);
973 return E_NOTIMPL;
974}
975
976static HRESULT WINAPI HTMLStyle_put_color(IHTMLStyle *iface, VARIANT v)
977{
979
980 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
981
983}
984
985static HRESULT WINAPI HTMLStyle_get_color(IHTMLStyle *iface, VARIANT *p)
986{
988
989 TRACE("(%p)->(%p)\n", This, p);
990
991 return get_nsstyle_attr_var(This->nsstyle, STYLEID_COLOR, p, 0);
992}
993
994static HRESULT WINAPI HTMLStyle_put_background(IHTMLStyle *iface, BSTR v)
995{
997
998 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
999
1001}
1002
1003static HRESULT WINAPI HTMLStyle_get_background(IHTMLStyle *iface, BSTR *p)
1004{
1006
1007 TRACE("(%p)->(%p)\n", This, p);
1008
1010}
1011
1013{
1015
1016 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1017
1019}
1020
1022{
1024
1025 TRACE("(%p)->(%p)\n", This, p);
1026
1028}
1029
1031{
1033
1034 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1035
1037}
1038
1040{
1042
1043 TRACE("(%p)->(%p)\n", This, p);
1044
1046}
1047
1049{
1051 static const WCHAR styleRepeat[] = {'r','e','p','e','a','t',0};
1052 static const WCHAR styleNoRepeat[] = {'n','o','-','r','e','p','e','a','t',0};
1053 static const WCHAR styleRepeatX[] = {'r','e','p','e','a','t','-','x',0};
1054 static const WCHAR styleRepeatY[] = {'r','e','p','e','a','t','-','y',0};
1055
1056 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1057
1058 /* fontWeight can only be one of the following */
1059 if(!v || strcmpiW(styleRepeat, v) == 0 || strcmpiW(styleNoRepeat, v) == 0 ||
1060 strcmpiW(styleRepeatX, v) == 0 || strcmpiW(styleRepeatY, v) == 0 )
1061 {
1063 }
1064
1065 return E_INVALIDARG;
1066}
1067
1069{
1071
1072 TRACE("(%p)->(%p)\n", This, p);
1073
1075}
1076
1078{
1080
1081 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1082
1084}
1085
1087{
1089
1090 TRACE("(%p)->(%p)\n", This, p);
1091
1093}
1094
1096{
1098
1099 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1100
1102}
1103
1105{
1107
1108 TRACE("(%p)->(%p)\n", This, p);
1109
1111}
1112
1114{
1116 WCHAR buf[14], *pos_val;
1117 nsAString pos_str;
1118 const WCHAR *val;
1119 DWORD val_len;
1120 HRESULT hres;
1121
1122 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1123
1125 if(FAILED(hres))
1126 return hres;
1127
1128 val_len = val ? strlenW(val) : 0;
1129
1130 nsAString_Init(&pos_str, NULL);
1132 if(SUCCEEDED(hres)) {
1133 const PRUnichar *pos, *posy;
1134 DWORD posy_len;
1135
1136 nsAString_GetData(&pos_str, &pos);
1137 posy = strchrW(pos, ' ');
1138 if(!posy) {
1139 static const WCHAR zero_pxW[] = {' ','0','p','x',0};
1140
1141 TRACE("no space in %s\n", debugstr_w(pos));
1142 posy = zero_pxW;
1143 }
1144
1145 posy_len = strlenW(posy);
1146 pos_val = heap_alloc((val_len+posy_len+1)*sizeof(WCHAR));
1147 if(pos_val) {
1148 if(val_len)
1149 memcpy(pos_val, val, val_len*sizeof(WCHAR));
1150 if(posy_len)
1151 memcpy(pos_val+val_len, posy, posy_len*sizeof(WCHAR));
1152 pos_val[val_len+posy_len] = 0;
1153 }else {
1155 }
1156 }
1157 nsAString_Finish(&pos_str);
1158 if(FAILED(hres))
1159 return hres;
1160
1161 TRACE("setting position to %s\n", debugstr_w(pos_val));
1163 heap_free(pos_val);
1164 return hres;
1165}
1166
1168{
1170 nsAString pos_str;
1171 BSTR ret;
1172 HRESULT hres;
1173
1174 TRACE("(%p)->(%p)\n", This, p);
1175
1176 nsAString_Init(&pos_str, NULL);
1178 if(SUCCEEDED(hres)) {
1179 const PRUnichar *pos, *space;
1180
1181 nsAString_GetData(&pos_str, &pos);
1182 space = strchrW(pos, ' ');
1183 if(!space) {
1184 WARN("no space in %s\n", debugstr_w(pos));
1185 space = pos + strlenW(pos);
1186 }
1187
1188 if(space != pos) {
1190 if(!ret)
1192 }else {
1193 ret = NULL;
1194 }
1195 }
1196 nsAString_Finish(&pos_str);
1197 if(FAILED(hres))
1198 return hres;
1199
1200 TRACE("returning %s\n", debugstr_w(ret));
1201 V_VT(p) = VT_BSTR;
1202 V_BSTR(p) = ret;
1203 return S_OK;
1204}
1205
1207{
1209 WCHAR buf[14], *pos_val;
1210 nsAString pos_str;
1211 const WCHAR *val;
1212 DWORD val_len;
1213 HRESULT hres;
1214
1215 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1216
1218 if(FAILED(hres))
1219 return hres;
1220
1221 val_len = val ? strlenW(val) : 0;
1222
1223 nsAString_Init(&pos_str, NULL);
1225 if(SUCCEEDED(hres)) {
1226 const PRUnichar *pos, *space;
1227 DWORD posx_len;
1228
1229 nsAString_GetData(&pos_str, &pos);
1230 space = strchrW(pos, ' ');
1231 if(space) {
1232 space++;
1233 }else {
1234 static const WCHAR zero_pxW[] = {'0','p','x',' ',0};
1235
1236 TRACE("no space in %s\n", debugstr_w(pos));
1237 pos = zero_pxW;
1238 space = pos + sizeof(zero_pxW)/sizeof(WCHAR)-1;
1239 }
1240
1241 posx_len = space-pos;
1242
1243 pos_val = heap_alloc((posx_len+val_len+1)*sizeof(WCHAR));
1244 if(pos_val) {
1245 memcpy(pos_val, pos, posx_len*sizeof(WCHAR));
1246 if(val_len)
1247 memcpy(pos_val+posx_len, val, val_len*sizeof(WCHAR));
1248 pos_val[posx_len+val_len] = 0;
1249 }else {
1251 }
1252 }
1253 nsAString_Finish(&pos_str);
1254 if(FAILED(hres))
1255 return hres;
1256
1257 TRACE("setting position to %s\n", debugstr_w(pos_val));
1259 heap_free(pos_val);
1260 return hres;
1261}
1262
1264{
1266 nsAString pos_str;
1267 BSTR ret;
1268 HRESULT hres;
1269
1270 TRACE("(%p)->(%p)\n", This, p);
1271
1272 nsAString_Init(&pos_str, NULL);
1274 if(SUCCEEDED(hres)) {
1275 const PRUnichar *pos, *posy;
1276
1277 nsAString_GetData(&pos_str, &pos);
1278 posy = strchrW(pos, ' ');
1279 if(posy) {
1280 ret = SysAllocString(posy+1);
1281 if(!ret)
1283 }else {
1284 ret = NULL;
1285 }
1286 }
1287 nsAString_Finish(&pos_str);
1288 if(FAILED(hres))
1289 return hres;
1290
1291 TRACE("returning %s\n", debugstr_w(ret));
1292 V_VT(p) = VT_BSTR;
1293 V_BSTR(p) = ret;
1294 return S_OK;
1295}
1296
1298{
1300
1301 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1302
1303 return set_nsstyle_attr_var(This->nsstyle, STYLEID_WORD_SPACING, &v, 0);
1304}
1305
1307{
1309 TRACE("(%p)->(%p)\n", This, p);
1310 return get_nsstyle_attr_var(This->nsstyle, STYLEID_WORD_SPACING, p, 0);
1311}
1312
1314{
1316
1317 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1318
1319 return set_nsstyle_attr_var(This->nsstyle, STYLEID_LETTER_SPACING, &v, 0);
1320}
1321
1323{
1325 TRACE("(%p)->(%p)\n", This, p);
1326 return get_nsstyle_attr_var(This->nsstyle, STYLEID_LETTER_SPACING, p, 0);
1327}
1328
1330{
1332
1333 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1334
1335 /* textDecoration can only be one of the following */
1336 if(!v || strcmpiW(styleNone, v) == 0 || strcmpiW(valUnderline, v) == 0 ||
1337 strcmpiW(valOverline, v) == 0 || strcmpiW(valLineThrough, v) == 0 ||
1338 strcmpiW(valBlink, v) == 0)
1339 {
1341 }
1342
1343 return E_INVALIDARG;
1344}
1345
1347{
1349
1350 TRACE("(%p)->(%p)\n", This, p);
1351
1353}
1354
1356{
1358
1359 TRACE("(%p)->(%x)\n", This, v);
1360
1362}
1363
1365{
1367
1368 TRACE("(%p)->(%p)\n", This, p);
1369
1371}
1372
1374{
1376
1377 TRACE("(%p)->(%x)\n", This, v);
1378
1380}
1381
1383{
1385
1386 TRACE("(%p)->(%p)\n", This, p);
1387
1389}
1390
1392{
1394
1395 TRACE("(%p)->(%x)\n", This, v);
1396
1398}
1399
1401{
1403
1404 TRACE("(%p)->(%p)\n", This, p);
1405
1407}
1408
1410{
1412
1413 TRACE("(%p)->(%x)\n", This, v);
1414
1416}
1417
1419{
1421
1422 TRACE("(%p)->(%p)\n", This, p);
1423
1425}
1426
1428{
1430
1431 TRACE("(%p)->(%x)\n", This, v);
1432
1434}
1435
1437{
1439
1440 TRACE("(%p)->(%p)\n", This, p);
1441
1443}
1444
1446{
1448
1449 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1450
1452}
1453
1455{
1457
1458 TRACE("(%p)->(%p)\n", This, p);
1459
1460 return get_nsstyle_attr_var(This->nsstyle, STYLEID_VERTICAL_ALIGN, p, 0);
1461}
1462
1464{
1466
1467 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1468
1470}
1471
1473{
1475
1476 TRACE("(%p)->(%p)\n", This, p);
1477
1479}
1480
1481static HRESULT WINAPI HTMLStyle_put_textAlign(IHTMLStyle *iface, BSTR v)
1482{
1484
1485 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1486
1488}
1489
1490static HRESULT WINAPI HTMLStyle_get_textAlign(IHTMLStyle *iface, BSTR *p)
1491{
1493
1494 TRACE("(%p)->(%p)\n", This, p);
1495
1497}
1498
1500{
1502
1503 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1504
1506}
1507
1509{
1511
1512 TRACE("(%p)->(%p)\n", This, p);
1513
1514 return get_nsstyle_attr_var(This->nsstyle, STYLEID_TEXT_INDENT, p, 0);
1515}
1516
1518{
1520
1521 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1522
1523 return set_nsstyle_attr_var(This->nsstyle, STYLEID_LINE_HEIGHT, &v, 0);
1524}
1525
1527{
1529
1530 TRACE("(%p)->(%p)\n", This, p);
1531
1532 return get_nsstyle_attr_var(This->nsstyle, STYLEID_LINE_HEIGHT, p, 0);
1533}
1534
1536{
1538
1539 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1540
1542}
1543
1545{
1547
1548 TRACE("(%p)->(%p)\n", This, p);
1549
1550 return get_nsstyle_attr_var(This->nsstyle, STYLEID_MARGIN_TOP, p, 0);
1551}
1552
1554{
1556
1557 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1558
1560}
1561
1563{
1565 TRACE("(%p)->(%p)\n", This, p);
1566 return get_nsstyle_attr_var(This->nsstyle, STYLEID_MARGIN_RIGHT, p, 0);
1567}
1568
1570{
1572
1573 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1574
1576}
1577
1579{
1581
1582 TRACE("(%p)->(%p)\n", This, p);
1583
1584 return get_nsstyle_attr_var(This->nsstyle, STYLEID_MARGIN_BOTTOM, p, 0);
1585}
1586
1588{
1590
1591 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1592
1594}
1595
1596static HRESULT WINAPI HTMLStyle_put_margin(IHTMLStyle *iface, BSTR v)
1597{
1599
1600 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1601
1602 return set_style_attr(This, STYLEID_MARGIN, v, 0);
1603}
1604
1605static HRESULT WINAPI HTMLStyle_get_margin(IHTMLStyle *iface, BSTR *p)
1606{
1608
1609 TRACE("(%p)->(%p)\n", This, p);
1610
1612}
1613
1615{
1617 TRACE("(%p)->(%p)\n", This, p);
1618 return get_nsstyle_attr_var(This->nsstyle, STYLEID_MARGIN_LEFT, p, 0);
1619}
1620
1622{
1624
1625 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1626
1628}
1629
1631{
1633
1634 TRACE("(%p)->(%p)\n", This, p);
1635
1636 return get_nsstyle_attr_var(This->nsstyle, STYLEID_PADDING_TOP, p, 0);
1637}
1638
1640{
1642
1643 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1644
1646}
1647
1649{
1651
1652 TRACE("(%p)->(%p)\n", This, p);
1653
1654 return get_nsstyle_attr_var(This->nsstyle, STYLEID_PADDING_RIGHT, p, 0);
1655}
1656
1658{
1660
1661 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1662
1664}
1665
1667{
1669
1670 TRACE("(%p)->(%p)\n", This, p);
1671
1672 return get_nsstyle_attr_var(This->nsstyle, STYLEID_PADDING_BOTTOM, p, 0);
1673}
1674
1676{
1678
1679 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1680
1682}
1683
1685{
1687
1688 TRACE("(%p)->(%p)\n", This, p);
1689
1690 return get_nsstyle_attr_var(This->nsstyle, STYLEID_PADDING_LEFT, p, 0);
1691}
1692
1693static HRESULT WINAPI HTMLStyle_put_padding(IHTMLStyle *iface, BSTR v)
1694{
1696
1697 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1698
1699 return set_style_attr(This, STYLEID_PADDING, v, 0);
1700}
1701
1702static HRESULT WINAPI HTMLStyle_get_padding(IHTMLStyle *iface, BSTR *p)
1703{
1705
1706 TRACE("(%p)->(%p)\n", This, p);
1707
1709}
1710
1711static HRESULT WINAPI HTMLStyle_put_border(IHTMLStyle *iface, BSTR v)
1712{
1714
1715 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1716
1717 return set_style_attr(This, STYLEID_BORDER, v, 0);
1718}
1719
1720static HRESULT WINAPI HTMLStyle_get_border(IHTMLStyle *iface, BSTR *p)
1721{
1723
1724 TRACE("(%p)->(%p)\n", This, p);
1725
1727}
1728
1729static HRESULT WINAPI HTMLStyle_put_borderTop(IHTMLStyle *iface, BSTR v)
1730{
1732 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1734}
1735
1736static HRESULT WINAPI HTMLStyle_get_borderTop(IHTMLStyle *iface, BSTR *p)
1737{
1739 TRACE("(%p)->(%p)\n", This, p);
1741}
1742
1744{
1746 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1748}
1749
1750static HRESULT WINAPI HTMLStyle_get_borderRight(IHTMLStyle *iface, BSTR *p)
1751{
1753 TRACE("(%p)->(%p)\n", This, p);
1755}
1756
1758{
1760 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1762}
1763
1765{
1767 TRACE("(%p)->(%p)\n", This, p);
1769}
1770
1772{
1774
1775 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1776
1778}
1779
1780static HRESULT WINAPI HTMLStyle_get_borderLeft(IHTMLStyle *iface, BSTR *p)
1781{
1783
1784 TRACE("(%p)->(%p)\n", This, p);
1785
1787}
1788
1790{
1792
1793 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1794
1796}
1797
1798static HRESULT WINAPI HTMLStyle_get_borderColor(IHTMLStyle *iface, BSTR *p)
1799{
1801
1802 TRACE("(%p)->(%p)\n", This, p);
1803
1805}
1806
1808{
1810
1811 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1812
1814}
1815
1817{
1819
1820 TRACE("(%p)->(%p)\n", This, p);
1821
1823}
1824
1826{
1828
1829 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1830
1832}
1833
1835{
1837
1838 TRACE("(%p)->(%p)\n", This, p);
1839
1841}
1842
1844{
1846
1847 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1848
1850}
1851
1853{
1855
1856 TRACE("(%p)->(%p)\n", This, p);
1857
1859}
1860
1862{
1864
1865 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1866
1868}
1869
1871{
1873
1874 TRACE("(%p)->(%p)\n", This, p);
1875
1877}
1878
1880{
1882 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1884}
1885
1886static HRESULT WINAPI HTMLStyle_get_borderWidth(IHTMLStyle *iface, BSTR *p)
1887{
1889 TRACE("(%p)->(%p)\n", This, p);
1891}
1892
1894{
1896
1897 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1898
1899 return set_nsstyle_attr_var(This->nsstyle, STYLEID_BORDER_TOP_WIDTH, &v, 0);
1900}
1901
1903{
1905
1906 TRACE("(%p)->(%p)\n", This, p);
1907
1909}
1910
1912{
1914
1915 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1916
1918}
1919
1921{
1923
1924 TRACE("(%p)->(%p)\n", This, p);
1925
1927}
1928
1930{
1932
1933 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1934
1936}
1937
1939{
1941 TRACE("(%p)->(%p)\n", This, p);
1943}
1944
1946{
1948
1949 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
1950
1952}
1953
1955{
1957 TRACE("(%p)->(%p)\n", This, p);
1959}
1960
1962{
1964 static const WCHAR styleWindowInset[] = {'w','i','n','d','o','w','-','i','n','s','e','t',0};
1965 HRESULT hres = S_OK;
1966 BSTR pstyle;
1967 int i=0;
1968 int last = 0;
1969
1970 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
1971
1972 while(v[i] && hres == S_OK)
1973 {
1974 if(v[i] == (WCHAR)' ')
1975 {
1976 pstyle = SysAllocStringLen(&v[last], (i-last));
1977 if( !(is_valid_border_style(pstyle) || strcmpiW(styleWindowInset, pstyle) == 0))
1978 {
1979 TRACE("1. Invalid style (%s)\n", debugstr_w(pstyle));
1981 }
1982 SysFreeString(pstyle);
1983 last = i+1;
1984 }
1985 i++;
1986 }
1987
1988 if(hres == S_OK)
1989 {
1990 pstyle = SysAllocStringLen(&v[last], i-last);
1991 if( !(is_valid_border_style(pstyle) || strcmpiW(styleWindowInset, pstyle) == 0))
1992 {
1993 TRACE("2. Invalid style (%s)\n", debugstr_w(pstyle));
1995 }
1996 SysFreeString(pstyle);
1997 }
1998
1999 if(hres == S_OK)
2001
2002 return hres;
2003}
2004
2005static HRESULT WINAPI HTMLStyle_get_borderStyle(IHTMLStyle *iface, BSTR *p)
2006{
2008 TRACE("(%p)->(%p)\n", This, p);
2010}
2011
2013{
2015 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2016
2018 return E_INVALIDARG;
2019
2021}
2022
2024{
2026 TRACE("(%p)->(%p)\n", This, p);
2028}
2029
2031{
2033 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2034
2036 return E_INVALIDARG;
2037
2039}
2040
2042{
2044 TRACE("(%p)->(%p)\n", This, p);
2046}
2047
2049{
2051 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2052
2054 return E_INVALIDARG;
2055
2057}
2058
2060{
2062 TRACE("(%p)->(%p)\n", This, p);
2064}
2065
2067{
2069 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2070
2072 return E_INVALIDARG;
2073
2075}
2076
2078{
2080 TRACE("(%p)->(%p)\n", This, p);
2082}
2083
2084static HRESULT WINAPI HTMLStyle_put_width(IHTMLStyle *iface, VARIANT v)
2085{
2087
2088 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
2089
2091}
2092
2093static HRESULT WINAPI HTMLStyle_get_width(IHTMLStyle *iface, VARIANT *p)
2094{
2096
2097 TRACE("(%p)->(%p)\n", This, p);
2098
2099 return get_nsstyle_attr_var(This->nsstyle, STYLEID_WIDTH, p, 0);
2100}
2101
2102static HRESULT WINAPI HTMLStyle_put_height(IHTMLStyle *iface, VARIANT v)
2103{
2105
2106 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
2107
2109}
2110
2111static HRESULT WINAPI HTMLStyle_get_height(IHTMLStyle *iface, VARIANT *p)
2112{
2114
2115 TRACE("(%p)->(%p)\n", This, p);
2116
2117 return get_nsstyle_attr_var(This->nsstyle, STYLEID_HEIGHT, p, 0);
2118}
2119
2121{
2123
2124 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2125
2126 return set_style_attr(This, STYLEID_FLOAT, v, 0);
2127}
2128
2129static HRESULT WINAPI HTMLStyle_get_styleFloat(IHTMLStyle *iface, BSTR *p)
2130{
2132
2133 TRACE("(%p)->(%p)\n", This, p);
2134
2136}
2137
2138static HRESULT WINAPI HTMLStyle_put_clear(IHTMLStyle *iface, BSTR v)
2139{
2141
2142 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2143
2144 return set_style_attr(This, STYLEID_CLEAR, v, 0);
2145}
2146
2147static HRESULT WINAPI HTMLStyle_get_clear(IHTMLStyle *iface, BSTR *p)
2148{
2150
2151 TRACE("(%p)->(%p)\n", This, p);
2152
2154}
2155
2156static HRESULT WINAPI HTMLStyle_put_display(IHTMLStyle *iface, BSTR v)
2157{
2159
2160 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2161
2162 return set_style_attr(This, STYLEID_DISPLAY, v, 0);
2163}
2164
2165static HRESULT WINAPI HTMLStyle_get_display(IHTMLStyle *iface, BSTR *p)
2166{
2168
2169 TRACE("(%p)->(%p)\n", This, p);
2170
2172}
2173
2175{
2177
2178 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2179
2181}
2182
2183static HRESULT WINAPI HTMLStyle_get_visibility(IHTMLStyle *iface, BSTR *p)
2184{
2186
2187 TRACE("(%p)->(%p)\n", This, p);
2188
2190}
2191
2193{
2195
2196 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2197
2199}
2200
2202{
2204
2205 TRACE("(%p)->(%p)\n", This, p);
2206
2208}
2209
2211{
2213
2214 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2215
2217}
2218
2220{
2222
2223 TRACE("(%p)->(%p)\n", This, p);
2224
2226}
2227
2229{
2231 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
2232 return E_NOTIMPL;
2233}
2234
2236{
2238 FIXME("(%p)->(%p)\n", This, p);
2239 return E_NOTIMPL;
2240}
2241
2242static HRESULT WINAPI HTMLStyle_put_listStyle(IHTMLStyle *iface, BSTR v)
2243{
2245
2246 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2247
2249}
2250
2251static HRESULT WINAPI HTMLStyle_get_listStyle(IHTMLStyle *iface, BSTR *p)
2252{
2254
2255 TRACE("(%p)->(%p)\n", This, p);
2256
2258}
2259
2261{
2263
2264 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2265
2266 return set_nsstyle_attr(This->nsstyle, STYLEID_WHITE_SPACE, v, 0);
2267}
2268
2269static HRESULT WINAPI HTMLStyle_get_whiteSpace(IHTMLStyle *iface, BSTR *p)
2270{
2272
2273 TRACE("(%p)->(%p)\n", This, p);
2274
2275 return get_nsstyle_attr(This->nsstyle, STYLEID_WHITE_SPACE, p, 0);
2276}
2277
2278static HRESULT WINAPI HTMLStyle_put_top(IHTMLStyle *iface, VARIANT v)
2279{
2281
2282 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
2283
2284 return set_nsstyle_attr_var(This->nsstyle, STYLEID_TOP, &v, 0);
2285}
2286
2287static HRESULT WINAPI HTMLStyle_get_top(IHTMLStyle *iface, VARIANT *p)
2288{
2290
2291 TRACE("(%p)->(%p)\n", This, p);
2292
2293 return get_nsstyle_attr_var(This->nsstyle, STYLEID_TOP, p, 0);
2294}
2295
2296static HRESULT WINAPI HTMLStyle_put_left(IHTMLStyle *iface, VARIANT v)
2297{
2299
2300 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
2301
2302 return set_nsstyle_attr_var(This->nsstyle, STYLEID_LEFT, &v, 0);
2303}
2304
2305static HRESULT WINAPI HTMLStyle_get_left(IHTMLStyle *iface, VARIANT *p)
2306{
2308
2309 TRACE("(%p)->(%p)\n", This, p);
2310
2311 return get_nsstyle_attr_var(This->nsstyle, STYLEID_LEFT, p, 0);
2312}
2313
2314static HRESULT WINAPI HTMLStyle_get_position(IHTMLStyle *iface, BSTR *p)
2315{
2317 TRACE("(%p)->(%p)\n", This, p);
2318 return IHTMLStyle2_get_position(&This->IHTMLStyle2_iface, p);
2319}
2320
2321static HRESULT WINAPI HTMLStyle_put_zIndex(IHTMLStyle *iface, VARIANT v)
2322{
2324
2325 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
2326
2327 return set_nsstyle_attr_var(This->nsstyle, STYLEID_Z_INDEX, &v, 0);
2328}
2329
2330static HRESULT WINAPI HTMLStyle_get_zIndex(IHTMLStyle *iface, VARIANT *p)
2331{
2333
2334 TRACE("(%p)->(%p)\n", This, p);
2335
2337}
2338
2339static HRESULT WINAPI HTMLStyle_put_overflow(IHTMLStyle *iface, BSTR v)
2340{
2342 static const WCHAR szVisible[] = {'v','i','s','i','b','l','e',0};
2343 static const WCHAR szScroll[] = {'s','c','r','o','l','l',0};
2344 static const WCHAR szHidden[] = {'h','i','d','d','e','n',0};
2345 static const WCHAR szAuto[] = {'a','u','t','o',0};
2346
2347 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2348
2349 /* overflow can only be one of the follow values. */
2350 if(!v || !*v || strcmpiW(szVisible, v) == 0 || strcmpiW(szScroll, v) == 0 ||
2351 strcmpiW(szHidden, v) == 0 || strcmpiW(szAuto, v) == 0)
2352 {
2353 return set_nsstyle_attr(This->nsstyle, STYLEID_OVERFLOW, v, 0);
2354 }
2355
2356 return E_INVALIDARG;
2357}
2358
2359
2360static HRESULT WINAPI HTMLStyle_get_overflow(IHTMLStyle *iface, BSTR *p)
2361{
2363
2364 TRACE("(%p)->(%p)\n", This, p);
2365
2366 if(!p)
2367 return E_INVALIDARG;
2368
2370}
2371
2373{
2375
2376 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2377
2378 return set_nsstyle_attr(This->nsstyle, STYLEID_PAGE_BREAK_BEFORE, v, 0);
2379}
2380
2382{
2384
2385 TRACE("(%p)->(%p)\n", This, p);
2386
2387 return get_nsstyle_attr(This->nsstyle, STYLEID_PAGE_BREAK_BEFORE, p, 0);
2388}
2389
2391{
2393
2394 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2395
2396 return set_nsstyle_attr(This->nsstyle, STYLEID_PAGE_BREAK_AFTER, v, 0);
2397}
2398
2400{
2402
2403 TRACE("(%p)->(%p)\n", This, p);
2404
2405 return get_nsstyle_attr(This->nsstyle, STYLEID_PAGE_BREAK_AFTER, p, 0);
2406}
2407
2408static HRESULT WINAPI HTMLStyle_put_cssText(IHTMLStyle *iface, BSTR v)
2409{
2411 nsAString text_str;
2412 nsresult nsres;
2413
2414 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2415
2416 nsAString_InitDepend(&text_str, v);
2417 nsres = nsIDOMCSSStyleDeclaration_SetCssText(This->nsstyle, &text_str);
2418 nsAString_Finish(&text_str);
2419 if(NS_FAILED(nsres)) {
2420 FIXME("SetCssStyle failed: %08x\n", nsres);
2421 return E_FAIL;
2422 }
2423
2424 return S_OK;
2425}
2426
2427static HRESULT WINAPI HTMLStyle_get_cssText(IHTMLStyle *iface, BSTR *p)
2428{
2430 nsAString text_str;
2431 nsresult nsres;
2432
2433 TRACE("(%p)->(%p)\n", This, p);
2434
2435 /* FIXME: Gecko style formatting is different than IE (uppercase). */
2436 nsAString_Init(&text_str, NULL);
2437 nsres = nsIDOMCSSStyleDeclaration_GetCssText(This->nsstyle, &text_str);
2438 if(NS_SUCCEEDED(nsres)) {
2439 const PRUnichar *text;
2440
2441 nsAString_GetData(&text_str, &text);
2442 *p = *text ? SysAllocString(text) : NULL;
2443 }else {
2444 FIXME("GetCssStyle failed: %08x\n", nsres);
2445 *p = NULL;
2446 }
2447
2448 nsAString_Finish(&text_str);
2449 return S_OK;
2450}
2451
2452static HRESULT WINAPI HTMLStyle_put_pixelTop(IHTMLStyle *iface, LONG v)
2453{
2455
2456 TRACE("(%p)->(%d)\n", This, v);
2457
2458 return set_style_pxattr(This->nsstyle, STYLEID_TOP, v);
2459}
2460
2461static HRESULT WINAPI HTMLStyle_get_pixelTop(IHTMLStyle *iface, LONG *p)
2462{
2464
2465 TRACE("(%p)->(%p)\n", This, p);
2466
2468}
2469
2470static HRESULT WINAPI HTMLStyle_put_pixelLeft(IHTMLStyle *iface, LONG v)
2471{
2473
2474 TRACE("(%p)->(%d)\n", This, v);
2475
2476 return set_style_pxattr(This->nsstyle, STYLEID_LEFT, v);
2477}
2478
2479static HRESULT WINAPI HTMLStyle_get_pixelLeft(IHTMLStyle *iface, LONG *p)
2480{
2482
2483 TRACE("(%p)->(%p)\n", This, p);
2484
2486}
2487
2489{
2491
2492 TRACE("(%p)->()\n", This);
2493
2494 return set_style_pxattr(This->nsstyle, STYLEID_WIDTH, v);
2495}
2496
2497static HRESULT WINAPI HTMLStyle_get_pixelWidth(IHTMLStyle *iface, LONG *p)
2498{
2500
2501 TRACE("(%p)->(%p)\n", This, p);
2502
2504}
2505
2507{
2509
2510 TRACE("(%p)->(%d)\n", This, v);
2511
2512 return set_style_pxattr(This->nsstyle, STYLEID_HEIGHT, v);
2513}
2514
2515static HRESULT WINAPI HTMLStyle_get_pixelHeight(IHTMLStyle *iface, LONG *p)
2516{
2518
2519 TRACE("(%p)->(%p)\n", This, p);
2520
2522}
2523
2524static HRESULT WINAPI HTMLStyle_put_posTop(IHTMLStyle *iface, float v)
2525{
2527
2528 TRACE("(%p)->(%f)\n", This, v);
2529
2530 return set_style_pos(This, STYLEID_TOP, v);
2531}
2532
2533static HRESULT WINAPI HTMLStyle_get_posTop(IHTMLStyle *iface, float *p)
2534{
2536
2537 TRACE("(%p)->(%p)\n", This, p);
2538
2539 if(!p)
2540 return E_POINTER;
2541
2543}
2544
2545static HRESULT WINAPI HTMLStyle_put_posLeft(IHTMLStyle *iface, float v)
2546{
2548
2549 TRACE("(%p)->(%f)\n", This, v);
2550
2551 return set_style_pos(This, STYLEID_LEFT, v);
2552}
2553
2554static HRESULT WINAPI HTMLStyle_get_posLeft(IHTMLStyle *iface, float *p)
2555{
2557
2558 TRACE("(%p)->(%p)\n", This, p);
2559
2560 if(!p)
2561 return E_POINTER;
2562
2564}
2565
2566static HRESULT WINAPI HTMLStyle_put_posWidth(IHTMLStyle *iface, float v)
2567{
2569
2570 TRACE("(%p)->(%f)\n", This, v);
2571
2573}
2574
2575static HRESULT WINAPI HTMLStyle_get_posWidth(IHTMLStyle *iface, float *p)
2576{
2578
2579 TRACE("(%p)->(%p)\n", This, p);
2580
2581 if(!p)
2582 return E_POINTER;
2583
2585 *p = 0.0f;
2586
2587 return S_OK;
2588}
2589
2590static HRESULT WINAPI HTMLStyle_put_posHeight(IHTMLStyle *iface, float v)
2591{
2593
2594 TRACE("(%p)->(%f)\n", This, v);
2595
2597}
2598
2599static HRESULT WINAPI HTMLStyle_get_posHeight(IHTMLStyle *iface, float *p)
2600{
2602
2603 TRACE("(%p)->(%p)\n", This, p);
2604
2605 if(!p)
2606 return E_POINTER;
2607
2609 *p = 0.0f;
2610
2611 return S_OK;
2612}
2613
2614static HRESULT WINAPI HTMLStyle_put_cursor(IHTMLStyle *iface, BSTR v)
2615{
2617
2618 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2619
2620 return set_style_attr(This, STYLEID_CURSOR, v, 0);
2621}
2622
2623static HRESULT WINAPI HTMLStyle_get_cursor(IHTMLStyle *iface, BSTR *p)
2624{
2626
2627 TRACE("(%p)->(%p)\n", This, p);
2628
2630}
2631
2632static HRESULT WINAPI HTMLStyle_put_clip(IHTMLStyle *iface, BSTR v)
2633{
2635
2636 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2637
2638 return set_style_attr(This, STYLEID_CLIP, v, 0);
2639}
2640
2641static HRESULT WINAPI HTMLStyle_get_clip(IHTMLStyle *iface, BSTR *p)
2642{
2644
2645 TRACE("(%p)->(%p)\n", This, p);
2646
2648}
2649
2650static void set_opacity(HTMLStyle *This, const WCHAR *val)
2651{
2652 nsAString name_str, val_str, empty_str;
2653 nsresult nsres;
2654
2655 static const WCHAR opacityW[] = {'o','p','a','c','i','t','y',0};
2656
2657 TRACE("%s\n", debugstr_w(val));
2658
2659 nsAString_InitDepend(&name_str, opacityW);
2660 nsAString_InitDepend(&val_str, val);
2662
2663 nsres = nsIDOMCSSStyleDeclaration_SetProperty(This->nsstyle, &name_str, &val_str, &empty_str);
2664 if(NS_FAILED(nsres))
2665 ERR("SetProperty failed: %08x\n", nsres);
2666
2667 nsAString_Finish(&name_str);
2668 nsAString_Finish(&val_str);
2670}
2671
2673{
2674 const WCHAR *ptr = This->elem->filter, *ptr2;
2675
2676 static const WCHAR alphaW[] = {'a','l','p','h','a'};
2677
2678 if(!ptr) {
2680 return;
2681 }
2682
2683 while(1) {
2684 while(isspaceW(*ptr))
2685 ptr++;
2686 if(!*ptr)
2687 break;
2688
2689 ptr2 = ptr;
2690 while(isalnumW(*ptr))
2691 ptr++;
2692 if(ptr == ptr2) {
2693 WARN("unexpected char '%c'\n", *ptr);
2694 break;
2695 }
2696 if(*ptr != '(') {
2697 WARN("expected '('\n");
2698 continue;
2699 }
2700
2701 if(ptr2 + sizeof(alphaW)/sizeof(WCHAR) == ptr && !memcmp(ptr2, alphaW, sizeof(alphaW))) {
2702 static const WCHAR formatW[] = {'%','f',0};
2703 static const WCHAR opacityW[] = {'o','p','a','c','i','t','y','='};
2704
2705 ptr++;
2706 do {
2707 while(isspaceW(*ptr))
2708 ptr++;
2709
2710 ptr2 = ptr;
2711 while(*ptr && *ptr != ',' && *ptr != ')')
2712 ptr++;
2713 if(!*ptr) {
2714 WARN("unexpected end of string\n");
2715 break;
2716 }
2717
2718 if(ptr-ptr2 > sizeof(opacityW)/sizeof(WCHAR) && !memcmp(ptr2, opacityW, sizeof(opacityW))) {
2719 float fval = 0.0f, e = 0.1f;
2720 WCHAR buf[32];
2721
2722 ptr2 += sizeof(opacityW)/sizeof(WCHAR);
2723
2724 while(isdigitW(*ptr2))
2725 fval = fval*10.0f + (float)(*ptr2++ - '0');
2726
2727 if(*ptr2 == '.') {
2728 while(isdigitW(*++ptr2)) {
2729 fval += e * (float)(*ptr2++ - '0');
2730 e *= 0.1f;
2731 }
2732 }
2733
2734 sprintfW(buf, formatW, fval * 0.01f);
2736 }else {
2737 FIXME("unknown param %s\n", debugstr_wn(ptr2, ptr-ptr2));
2738 }
2739
2740 if(*ptr == ',')
2741 ptr++;
2742 }while(*ptr != ')');
2743 }else {
2744 FIXME("unknown filter %s\n", debugstr_wn(ptr2, ptr-ptr2));
2745 ptr = strchrW(ptr, ')');
2746 if(!ptr)
2747 break;
2748 ptr++;
2749 }
2750 }
2751}
2752
2753static HRESULT WINAPI HTMLStyle_put_filter(IHTMLStyle *iface, BSTR v)
2754{
2756 WCHAR *new_filter = NULL;
2757
2758 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
2759
2760 if(!This->elem) {
2761 FIXME("Element already destroyed\n");
2762 return E_UNEXPECTED;
2763 }
2764
2765 if(v) {
2766 new_filter = heap_strdupW(v);
2767 if(!new_filter)
2768 return E_OUTOFMEMORY;
2769 }
2770
2771 heap_free(This->elem->filter);
2772 This->elem->filter = new_filter;
2773
2775 return S_OK;
2776}
2777
2778static HRESULT WINAPI HTMLStyle_get_filter(IHTMLStyle *iface, BSTR *p)
2779{
2781
2782 TRACE("(%p)->(%p)\n", This, p);
2783
2784 if(!This->elem) {
2785 FIXME("Element already destroyed\n");
2786 return E_UNEXPECTED;
2787 }
2788
2789 if(This->elem->filter) {
2790 *p = SysAllocString(This->elem->filter);
2791 if(!*p)
2792 return E_OUTOFMEMORY;
2793 }else {
2794 *p = NULL;
2795 }
2796
2797 return S_OK;
2798}
2799
2800static HRESULT WINAPI HTMLStyle_setAttribute(IHTMLStyle *iface, BSTR strAttributeName,
2801 VARIANT AttributeValue, LONG lFlags)
2802{
2804 HRESULT hres;
2805 DISPID dispid;
2806
2807 TRACE("(%p)->(%s %s %08x)\n", This, debugstr_w(strAttributeName),
2808 debugstr_variant(&AttributeValue), lFlags);
2809
2810 if(!strAttributeName)
2811 return E_INVALIDARG;
2812
2813 if(lFlags == 1)
2814 FIXME("Parameter lFlags ignored\n");
2815
2816 hres = HTMLStyle_GetIDsOfNames(iface, &IID_NULL, &strAttributeName, 1,
2817 LOCALE_USER_DEFAULT, &dispid);
2818 if(hres == S_OK)
2819 {
2820 VARIANT ret;
2821 DISPID dispidNamed = DISPID_PROPERTYPUT;
2822 DISPPARAMS params;
2823
2824 params.cArgs = 1;
2825 params.rgvarg = &AttributeValue;
2826 params.cNamedArgs = 1;
2827 params.rgdispidNamedArgs = &dispidNamed;
2828
2831 }
2832 else
2833 {
2834 FIXME("Custom attributes not supported.\n");
2835 }
2836
2837 TRACE("ret: %08x\n", hres);
2838
2839 return hres;
2840}
2841
2842static HRESULT WINAPI HTMLStyle_getAttribute(IHTMLStyle *iface, BSTR strAttributeName,
2843 LONG lFlags, VARIANT *AttributeValue)
2844{
2846 HRESULT hres;
2847 DISPID dispid;
2848
2849 TRACE("(%p)->(%s v%p %08x)\n", This, debugstr_w(strAttributeName),
2850 AttributeValue, lFlags);
2851
2852 if(!AttributeValue || !strAttributeName)
2853 return E_INVALIDARG;
2854
2855 if(lFlags == 1)
2856 FIXME("Parameter lFlags ignored\n");
2857
2858 hres = HTMLStyle_GetIDsOfNames(iface, &IID_NULL, &strAttributeName, 1,
2859 LOCALE_USER_DEFAULT, &dispid);
2860 if(hres == S_OK)
2861 {
2862 DISPPARAMS params = {NULL, NULL, 0, 0 };
2863
2865 DISPATCH_PROPERTYGET, &params, AttributeValue, NULL, NULL);
2866 }
2867 else
2868 {
2869 FIXME("Custom attributes not supported.\n");
2870 }
2871
2872 return hres;
2873}
2874
2875static HRESULT WINAPI HTMLStyle_removeAttribute(IHTMLStyle *iface, BSTR strAttributeName,
2876 LONG lFlags, VARIANT_BOOL *pfSuccess)
2877{
2879 const style_tbl_entry_t *style_entry;
2880 nsAString name_str, ret_str;
2881 nsresult nsres;
2882 HRESULT hres;
2883
2884 TRACE("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
2885
2886 style_entry = lookup_style_tbl(strAttributeName);
2887 if(!style_entry) {
2888 DISPID dispid;
2889 unsigned i;
2890
2891 hres = IDispatchEx_GetDispID(&This->dispex.IDispatchEx_iface, strAttributeName,
2892 (lFlags&1) ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid);
2893 if(hres != S_OK) {
2894 *pfSuccess = VARIANT_FALSE;
2895 return S_OK;
2896 }
2897
2898 for(i=0; i < sizeof(style_tbl)/sizeof(*style_tbl); i++) {
2899 if(dispid == style_tbl[i].dispid)
2900 break;
2901 }
2902
2903 if(i == sizeof(style_tbl)/sizeof(*style_tbl))
2904 return remove_attribute(&This->dispex, dispid, pfSuccess);
2905 style_entry = style_tbl+i;
2906 }
2907
2908 /* filter property is a special case */
2909 if(style_entry->dispid == DISPID_IHTMLSTYLE_FILTER) {
2910 *pfSuccess = This->elem->filter && *This->elem->filter ? VARIANT_TRUE : VARIANT_FALSE;
2911 heap_free(This->elem->filter);
2912 This->elem->filter = NULL;
2914 return S_OK;
2915 }
2916
2917 nsAString_InitDepend(&name_str, style_entry->name);
2918 nsAString_Init(&ret_str, NULL);
2919 nsres = nsIDOMCSSStyleDeclaration_RemoveProperty(This->nsstyle, &name_str, &ret_str);
2920 if(NS_SUCCEEDED(nsres)) {
2921 const PRUnichar *ret;
2922 nsAString_GetData(&ret_str, &ret);
2923 *pfSuccess = *ret ? VARIANT_TRUE : VARIANT_FALSE;
2924 }else {
2925 ERR("RemoveProperty failed: %08x\n", nsres);
2926 }
2927 nsAString_Finish(&name_str);
2928 nsAString_Finish(&ret_str);
2929 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
2930}
2931
2932static HRESULT WINAPI HTMLStyle_toString(IHTMLStyle *iface, BSTR *String)
2933{
2935 FIXME("(%p)->(%p)\n", This, String);
2936 return E_NOTIMPL;
2937}
2938
2939static const IHTMLStyleVtbl HTMLStyleVtbl = {
3126};
3127
3129{
3130 const style_tbl_entry_t *style_entry;
3131
3132 style_entry = lookup_style_tbl(name);
3133 if(style_entry) {
3134 *dispid = style_entry->dispid;
3135 return S_OK;
3136 }
3137
3138 return DISP_E_UNKNOWNNAME;
3139}
3140
3142 NULL,
3144 NULL,
3145 NULL
3146};
3147
3148static const tid_t HTMLStyle_iface_tids[] = {
3149 IHTMLStyle6_tid,
3150 IHTMLStyle5_tid,
3151 IHTMLStyle4_tid,
3152 IHTMLStyle3_tid,
3153 IHTMLStyle2_tid,
3154 IHTMLStyle_tid,
3155 0
3156};
3159 DispHTMLStyle_tid,
3160 NULL,
3162};
3163
3165{
3166 nsIDOMElementCSSInlineStyle *nselemstyle;
3167 nsresult nsres;
3168
3169 if(!elem->nselem) {
3170 FIXME("NULL nselem\n");
3171 return E_NOTIMPL;
3172 }
3173
3174 nsres = nsIDOMHTMLElement_QueryInterface(elem->nselem, &IID_nsIDOMElementCSSInlineStyle,
3175 (void**)&nselemstyle);
3176 assert(nsres == NS_OK);
3177
3178 nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, ret);
3179 nsIDOMElementCSSInlineStyle_Release(nselemstyle);
3180 if(NS_FAILED(nsres)) {
3181 ERR("GetStyle failed: %08x\n", nsres);
3182 return E_FAIL;
3183 }
3184
3185 return S_OK;
3186}
3187
3189{
3192 HRESULT hres;
3193
3194 hres = get_style_from_elem(elem, &nsstyle);
3195 if(FAILED(hres))
3196 return hres;
3197
3198 style = heap_alloc_zero(sizeof(HTMLStyle));
3199 if(!style) {
3200 nsIDOMCSSStyleDeclaration_Release(nsstyle);
3201 return E_OUTOFMEMORY;
3202 }
3203
3204 style->IHTMLStyle_iface.lpVtbl = &HTMLStyleVtbl;
3205 style->ref = 1;
3206 style->nsstyle = nsstyle;
3207 style->elem = elem;
3210
3211 nsIDOMCSSStyleDeclaration_AddRef(nsstyle);
3212
3213 init_dispex(&style->dispex, (IUnknown*)&style->IHTMLStyle_iface, &HTMLStyle_dispex);
3214
3215 *ret = style;
3216 return S_OK;
3217}
3218
3220{
3222 HRESULT hres;
3223
3225 if(FAILED(hres))
3226 return hres;
3227
3228 hres = get_nsstyle_attr(style, styleid, ret, 0);
3229 nsIDOMCSSStyleDeclaration_Release(style);
3230 return hres;
3231}
3232
3234{
3236 HRESULT hres;
3237
3239 if(FAILED(hres))
3240 return hres;
3241
3242 hres = set_nsstyle_attr(style, styleid, val, 0);
3243 nsIDOMCSSStyleDeclaration_Release(style);
3244 return hres;
3245}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
Arabic default style
Definition: afstyles.h:94
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
static const TCHAR empty_str[]
Definition: dialog.c:20
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:114
#define WARN(fmt,...)
Definition: debug.h:115
#define ERR(fmt,...)
Definition: debug.h:113
FT_UInt sid
Definition: cffcmap.c:139
Definition: _set.h:50
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static WCHAR * heap_strdupW(const WCHAR *str)
Definition: propsheet.c:178
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
@ VT_NULL
Definition: compat.h:2296
@ VT_BYREF
Definition: compat.h:2342
@ VT_I4
Definition: compat.h:2298
const char * debugstr_mshtml_guid(const GUID *iid)
Definition: main.c:542
const WCHAR * text
Definition: package.c:1799
#define assert(x)
Definition: debug.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
const GLdouble * v
Definition: gl.h:2040
const GLubyte * c
Definition: glext.h:8905
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static HRESULT WINAPI HTMLStyle_put_marginBottom(IHTMLStyle *iface, VARIANT v)
Definition: htmlstyle.c:1569
static const WCHAR attrFontSize[]
Definition: htmlstyle.c:100
static const WCHAR attrMinHeight[]
Definition: htmlstyle.c:136
static const WCHAR attrListStyleType[]
Definition: htmlstyle.c:118
static HRESULT WINAPI HTMLStyle_put_listStyle(IHTMLStyle *iface, BSTR v)
Definition: htmlstyle.c:2242
static HRESULT WINAPI HTMLStyle_put_borderLeftWidth(IHTMLStyle *iface, VARIANT v)
Definition: htmlstyle.c:1945
static HRESULT get_style_from_elem(HTMLElement *elem, nsIDOMCSSStyleDeclaration **ret)
Definition: htmlstyle.c:3164
static HRESULT WINAPI HTMLStyle_put_fontFamily(IHTMLStyle *iface, BSTR v)
Definition: htmlstyle.c:835
static HRESULT WINAPI HTMLStyle_get_top(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:2287
static HRESULT WINAPI HTMLStyle_get_padding(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:1702
static const WCHAR attrBorderLeftColor[]
Definition: htmlstyle.c:51
static HRESULT WINAPI HTMLStyle_get_pageBreakAfter(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:2399
static const WCHAR valBlink[]
Definition: htmlstyle.c:301
static HRESULT WINAPI HTMLStyle_get_borderRightStyle(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:2041
static HRESULT WINAPI HTMLStyle_get_paddingBottom(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1666
static HRESULT WINAPI HTMLStyle_get_borderBottomColor(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1852
static HRESULT WINAPI HTMLStyle_get_paddingTop(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1630
static const WCHAR attrCursor[]
Definition: htmlstyle.c:88
static HRESULT WINAPI HTMLStyle_get_backgroundRepeat(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:1068
static HRESULT WINAPI HTMLStyle_put_pixelHeight(IHTMLStyle *iface, LONG v)
Definition: htmlstyle.c:2506
static const WCHAR attrBorderTopWidth[]
Definition: htmlstyle.c:73
static HRESULT WINAPI HTMLStyle_get_zIndex(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:2330
static const WCHAR attrLeft[]
Definition: htmlstyle.c:110
static HRESULT WINAPI HTMLStyle_get_paddingRight(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1648
static const WCHAR attrOutline[]
Definition: htmlstyle.c:140
static HRESULT WINAPI HTMLStyle_put_pixelLeft(IHTMLStyle *iface, LONG v)
Definition: htmlstyle.c:2470
static const WCHAR pxW[]
Definition: htmlstyle.c:194
static HRESULT WINAPI HTMLStyle_put_verticalAlign(IHTMLStyle *iface, VARIANT v)
Definition: htmlstyle.c:1445
static const WCHAR px_formatW[]
Definition: htmlstyle.c:304
static HRESULT WINAPI HTMLStyle_get_borderRightWidth(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1920
static const WCHAR attrBorderTopColor[]
Definition: htmlstyle.c:67
static HRESULT WINAPI HTMLStyle_put_height(IHTMLStyle *iface, VARIANT v)
Definition: htmlstyle.c:2102
static HRESULT WINAPI HTMLStyle_put_whiteSpace(IHTMLStyle *iface, BSTR v)
Definition: htmlstyle.c:2260
static HRESULT WINAPI HTMLStyle_get_left(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:2305
static HRESULT WINAPI HTMLStyle_get_backgroundPositionX(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1167
static HRESULT WINAPI HTMLStyle_put_borderBottomColor(IHTMLStyle *iface, VARIANT v)
Definition: htmlstyle.c:1843
static HRESULT WINAPI HTMLStyle_get_listStyleImage(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:2235
static HRESULT WINAPI HTMLStyle_get_wordSpacing(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1306
static const WCHAR attrBottom[]
Definition: htmlstyle.c:77
HRESULT get_nsstyle_attr_var(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, VARIANT *p, DWORD flags)
Definition: htmlstyle.c:547
static HRESULT WINAPI HTMLStyle_get_marginLeft(IHTMLStyle *iface, VARIANT *p)
Definition: htmlstyle.c:1614
static HRESULT WINAPI HTMLStyle_get_listStyleType(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:2201
static HRESULT WINAPI HTMLStyle_get_fontStyle(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:871
static HRESULT WINAPI HTMLStyle_GetTypeInfoCount(IHTMLStyle *iface, UINT *pctinfo)
Definition: htmlstyle.c:804
static const WCHAR attrMarginTop[]
Definition: htmlstyle.c:130
static const WCHAR attrBackgroundPositionY[]
Definition: htmlstyle.c:33
static HRESULT WINAPI HTMLStyle_get_overflow(IHTMLStyle *iface, BSTR *p)
Definition: htmlstyle.c:2360
static LPWSTR fix_px_value(LPCWSTR val)
Definition: