HtmlDocument の script タグの内容を書き換えたい
いろいろ試行錯誤したゴミコード。
private void orixWb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // sender は wb と同じインスタンスなので、見る必要はない。 HtmlElement scriptElem = orixWb.Document.CreateElement("SCRIPT"); scriptElem.SetAttribute("type", "text/javascript"); scriptElem.SetAttribute("language", "javascript"); scriptElem.SetAttribute("src", "http://example.com/focus.js"); //HtmlElementCollection hec = orixWb.Document.GetElementsByTagName("HEAD"); //hec[0].InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeBegin, scriptElem); HtmlElementCollection scriptElements = orixWb.Document.GetElementsByTagName("SCRIPT"); scriptElements[4].InsertAdjacentElement(HtmlElementInsertionOrientation.BeforeBegin, scriptElem); //HtmlElementCollection hec = orixWb.Document.GetElementsByTagName("script"); //hec[2].SetAttribute("src", "http://example.com/focus.js"); // foreach (HtmlElement he in hec) // { // if (he.OuterHtml != null && he.OuterHtml.Contains("self.focus()")) // { // Console.WriteLine("removed: " + he.OuterHtml); // //he.Document.Write("<script>window.alert(3);</script>"); // //he.Document.Write(he.Document.All[0].OuterHtml.Replace("self.focus()", "window.alert(4)")); // //he.Document.Write(he.Document.All[0].OuterHtml.Replace("self.focus()", "")); // //he.InnerHtml = "window.alert(4);"; // //orixWb.Document.OpenNew(true); // //orixWb.Document.Write(he.Document.All[0].OuterHtml.Replace("self.focus()", "window.alert(4)")); // //HtmlElement scriptElem = orixWb.Document.CreateElement("script"); // //HtmlElement scriptElem = he.Document.CreateElement("hoge"); // //scriptElem.SetAttribute("type", "text/abcdefjavascript"); // //scriptElem.InnerText = "window.alert(3)"; // //orixWb.Document.Body.AppendChild(scriptElem); // //orixWb.Document.Body.AppendChild(scriptElem); // //HtmlElementCollection bc = orixWb.Document.GetElementsByTagName("head"); // //bc[0].AppendChild(scriptElem); // //orixWb.Document.Body.InnerHtml += "<script>window.alert(5)</script>"; // //HtmlElement x = orixWb.Document.CreateElement("input"); // //x.SetAttribute("name", "self"); // //x.SetAttribute("type", "text"); // //// x.SetAttribute("onchange", "javascript:window.alert(3)"); // //x.SetAttribute("value", "VBで追加したTextBox"); // //x.SetAttribute("size", "40"); // //x.Click += new HtmlElementEventHandler(x_Click); // // orixWb.Document.Body.AppendChild(x); // //HtmlElement x = orixWb.Document.CreateElement("script"); // //x.SetAttribute("type", "text/javascript"); // //x.OuterHtml = "window.alert(3)"; // //HtmlElementCollection bc = orixWb.Document.GetElementsByTagName("body"); // これも効く // //bc[0].AppendChild(x); // これも効く // //orixWb.ScriptErrorsSuppressed = false; // HtmlElementCollection y = orixWb.Document.GetElementsByTagName("script"); // y[3].SetAttribute("src", "http://example.com/focus.js"); // // y[0].SetAttribute("src", "http://example.com/focus.js"); // foreach (HtmlElement p in y) // { // //p.SetAttribute("src", "http://example.com/focus.js"); // //if (p.InnerHtml != null && p.InnerHtml.Contains("self.focus()")) // //{ // // p.SetAttribute("type", "text/xxvbscript"); // // p.SetAttribute("language", "hoge"); // // //p.SetAttribute("language", "vbscript"); // // p.SetAttribute("src", "example.com/focus.js"); // // object o = p.DomElement; // //} // } // //orixWb.Document.Focusing += new HtmlElementEventHandler(Document_Focusing); // //HtmlElementCollection bc = orixWb.Document.GetElementsByTagName("head"); // // bc[0].AppendChild(x); // //orixWb.Document.OpenNew(true); // //orixWb.Document.Write(he.Document.All[0].InnerHtml.Replace("self.focus()", "window.alert(4)")); // break; // } // else // { // } // } //} orixBrowser.DocumentCompleted(orixWb, e); }
なお、focus.js は、これに差し替えたい JavaScript のコード。内容はつぎのとおり。
function foo() { window.alert(789); } function Hoge_focus() { } function Hoge() { this.focus = Hoge_focus; } var self = new Hoge();
self という名前の変数を、自分のダミークラスに差し替えて、focus メソッドを無効にしたい。
HtmlDocument の差し替えにさえ成功すればうまく行くはずなのだが。