Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index 19d77afcb8e6d2c02e924007454be93d07f6d5fe..d2eab10bd7694afd9a0bac8153296d6fb03e5429 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -4151,6 +4151,22 @@ static Editor::Command command(Document* document, const String& commandName, bo |
bool Document::execCommand(const String& commandName, bool userInterface, const String& value) |
{ |
+ // We don't allow recusrive |execCommand()| to protect against attack code. |
+ // Recursive call of |execCommand()| could be happened by moving iframe |
+ // with script triggered by insertion, e.g. <iframe src="javascript:..."> |
+ // <iframe onload="...">. This usage is valid as of the specification |
+ // although, it isn't common use case, rather it is used as attack code. |
+ static bool inExecCommand = false; |
+ if (inExecCommand) { |
+ String message = "We don't execute document.execCommand() this time, because it is called recursively."; |
+ addConsoleMessage(JSMessageSource, WarningMessageLevel, message); |
+ return false; |
+ } |
+ TemporaryChange<bool> executeScope(inExecCommand, true); |
+ |
+ // Postpone DOM mutation events, which can execute scripts and change |
+ // DOM tree against implementation assumption. |
+ EventQueueScope eventQueueScope; |
return command(this, commandName, userInterface).execute(value); |
} |