Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlstylesheet.c | 36 ++++++++++++++++++++++++++++++++++-- dlls/mshtml/tests/dom.js | 26 ++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c index 4519b06..b6f1c98 100644 --- a/dlls/mshtml/htmlstylesheet.c +++ b/dlls/mshtml/htmlstylesheet.c @@ -795,9 +795,41 @@ static HRESULT WINAPI HTMLStyleSheet_addRule(IHTMLStyleSheet *iface, BSTR bstrSe BSTR bstrStyle, LONG lIndex, LONG *plIndex) { HTMLStyleSheet *This = impl_from_IHTMLStyleSheet(iface); - FIXME("(%p)->(%s %s %d %p)\n", This, debugstr_w(bstrSelector), debugstr_w(bstrStyle), + const WCHAR format[] = L"%s {%s}"; + nsIDOMCSSRuleList *nslist = NULL; + UINT32 length, new_index; + nsAString nsstr; + nsresult nsres; + WCHAR *rule; + size_t len; + + TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(bstrSelector), debugstr_w(bstrStyle), lIndex, plIndex); - return E_NOTIMPL; + + if(!bstrSelector || !bstrStyle || !bstrSelector[0] || !bstrStyle[0]) + return E_INVALIDARG; + + nsres = nsIDOMCSSStyleSheet_GetCssRules(This->nsstylesheet, &nslist); + if(NS_FAILED(nsres)) + return E_FAIL; + nsIDOMCSSRuleList_GetLength(nslist, &length); + + if(lIndex > length) + lIndex = length; + + len = ARRAY_SIZE(format) - 4 /* %s twice */ + wcslen(bstrSelector) + wcslen(bstrStyle); + if(!(rule = heap_alloc(len * sizeof(WCHAR)))) + return E_OUTOFMEMORY; + swprintf(rule, len, format, bstrSelector, bstrStyle); + + nsAString_InitDepend(&nsstr, rule); + nsres = nsIDOMCSSStyleSheet_InsertRule(This->nsstylesheet, &nsstr, lIndex, &new_index); + if(NS_FAILED(nsres)) WARN("failed: %08x\n", nsres); + nsAString_Finish(&nsstr); + heap_free(rule); + + *plIndex = new_index; + return map_nsresult(nsres); }
static HRESULT WINAPI HTMLStyleSheet_removeImport(IHTMLStyleSheet *iface, LONG lIndex) diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js index 73c2b3b..3a2b96a 100644 --- a/dlls/mshtml/tests/dom.js +++ b/dlls/mshtml/tests/dom.js @@ -405,6 +405,32 @@ sync_test("stylesheets", function() { stylesheet.insertRule(".input { margin-left: 1px; }", 3); ok(false, "expected exception"); }catch(e) {} + + id = stylesheet.addRule(".p", "margin-top: 2px"); + ok(id === 2, "id = " + id); + ok(document.styleSheets.length === 1, "document.styleSheets.length = " + document.styleSheets.length); + ok(stylesheet.rules.length === 3, "stylesheet.rules.length = " + stylesheet.rules.length); + + id = stylesheet.addRule(".pre", "border: none", -1); + ok(id === 3, "id = " + id); + ok(stylesheet.rules.length === 4, "stylesheet.rules.length = " + stylesheet.rules.length); + + id = stylesheet.addRule(".h1", " ", 0); + ok(id === 0, "id = " + id); + ok(stylesheet.rules.length === 5, "stylesheet.rules.length = " + stylesheet.rules.length); + + id = stylesheet.addRule(".h2", "color: black", 8); + ok(id === 5, "id = " + id); + ok(stylesheet.rules.length === 6, "stylesheet.rules.length = " + stylesheet.rules.length); + + try { + stylesheet.addRule("", "border: none", 0); + ok(false, "expected exception"); + }catch(e) {} + try { + stylesheet.addRule(".img", "", 0); + ok(false, "expected exception"); + }catch(e) {} });
sync_test("storage", function() {