Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: Source/core/dom/Document.cpp

Issue 1155353002: Throw DOMException when invoked Document::execCommand on non-{X,}HTML documents (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: revert accidental edit Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Document.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 4227 matching lines...) Expand 10 before | Expand all | Expand 10 after
4238 static Editor::Command command(Document* document, const String& commandName) 4238 static Editor::Command command(Document* document, const String& commandName)
4239 { 4239 {
4240 LocalFrame* frame = document->frame(); 4240 LocalFrame* frame = document->frame();
4241 if (!frame || frame->document() != document) 4241 if (!frame || frame->document() != document)
4242 return Editor::Command(); 4242 return Editor::Command();
4243 4243
4244 document->updateLayoutTreeIfNeeded(); 4244 document->updateLayoutTreeIfNeeded();
4245 return frame->editor().command(commandName, CommandFromDOM); 4245 return frame->editor().command(commandName, CommandFromDOM);
4246 } 4246 }
4247 4247
4248 bool Document::execCommand(const String& commandName, bool, const String& value) 4248 bool Document::execCommand(const String& commandName, bool, const String& value, ExceptionState& exceptionState)
4249 { 4249 {
4250 if (!isHTMLDocument() && !isXHTMLDocument()) {
4251 exceptionState.throwDOMException(InvalidStateError, "execCommand is only supported on HTML documents.");
4252 return false;
4253 }
4254
4250 // We don't allow recursive |execCommand()| to protect against attack code. 4255 // We don't allow recursive |execCommand()| to protect against attack code.
4251 // Recursive call of |execCommand()| could be happened by moving iframe 4256 // Recursive call of |execCommand()| could be happened by moving iframe
4252 // with script triggered by insertion, e.g. <iframe src="javascript:..."> 4257 // with script triggered by insertion, e.g. <iframe src="javascript:...">
4253 // <iframe onload="...">. This usage is valid as of the specification 4258 // <iframe onload="...">. This usage is valid as of the specification
4254 // although, it isn't common use case, rather it is used as attack code. 4259 // although, it isn't common use case, rather it is used as attack code.
4255 static bool inExecCommand = false; 4260 static bool inExecCommand = false;
4256 if (inExecCommand) { 4261 if (inExecCommand) {
4257 String message = "We don't execute document.execCommand() this time, bec ause it is called recursively."; 4262 String message = "We don't execute document.execCommand() this time, bec ause it is called recursively.";
4258 addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessage Level, message)); 4263 addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessage Level, message));
4259 return false; 4264 return false;
4260 } 4265 }
4261 TemporaryChange<bool> executeScope(inExecCommand, true); 4266 TemporaryChange<bool> executeScope(inExecCommand, true);
4262 4267
4263 // Postpone DOM mutation events, which can execute scripts and change 4268 // Postpone DOM mutation events, which can execute scripts and change
4264 // DOM tree against implementation assumption. 4269 // DOM tree against implementation assumption.
4265 EventQueueScope eventQueueScope; 4270 EventQueueScope eventQueueScope;
4266 Editor::Command editorCommand = command(this, commandName); 4271 Editor::Command editorCommand = command(this, commandName);
4267 Platform::current()->histogramSparse("WebCore.Document.execCommand", editorC ommand.idForHistogram()); 4272 Platform::current()->histogramSparse("WebCore.Document.execCommand", editorC ommand.idForHistogram());
4268 return editorCommand.execute(value); 4273 return editorCommand.execute(value);
4269 } 4274 }
4270 4275
4271 bool Document::queryCommandEnabled(const String& commandName) 4276 bool Document::queryCommandEnabled(const String& commandName, ExceptionState& ex ceptionState)
4272 { 4277 {
4278 if (!isHTMLDocument() && !isXHTMLDocument()) {
4279 exceptionState.throwDOMException(InvalidStateError, "queryCommandEnabled is only supported on HTML documents.");
4280 return false;
4281 }
4282
4273 return command(this, commandName).isEnabled(); 4283 return command(this, commandName).isEnabled();
4274 } 4284 }
4275 4285
4276 bool Document::queryCommandIndeterm(const String& commandName) 4286 bool Document::queryCommandIndeterm(const String& commandName, ExceptionState& e xceptionState)
4277 { 4287 {
4288 if (!isHTMLDocument() && !isXHTMLDocument()) {
4289 exceptionState.throwDOMException(InvalidStateError, "queryCommandIndeter m is only supported on HTML documents.");
4290 return false;
4291 }
4292
4278 return command(this, commandName).state() == MixedTriState; 4293 return command(this, commandName).state() == MixedTriState;
4279 } 4294 }
4280 4295
4281 bool Document::queryCommandState(const String& commandName) 4296 bool Document::queryCommandState(const String& commandName, ExceptionState& exce ptionState)
4282 { 4297 {
4298 if (!isHTMLDocument() && !isXHTMLDocument()) {
4299 exceptionState.throwDOMException(InvalidStateError, "queryCommandState i s only supported on HTML documents.");
4300 return false;
4301 }
4302
4283 return command(this, commandName).state() == TrueTriState; 4303 return command(this, commandName).state() == TrueTriState;
4284 } 4304 }
4285 4305
4286 bool Document::queryCommandSupported(const String& commandName) 4306 bool Document::queryCommandSupported(const String& commandName, ExceptionState& exceptionState)
4287 { 4307 {
4308 if (!isHTMLDocument() && !isXHTMLDocument()) {
4309 exceptionState.throwDOMException(InvalidStateError, "queryCommandSupport ed is only supported on HTML documents.");
4310 return false;
4311 }
4312
4288 return command(this, commandName).isSupported(); 4313 return command(this, commandName).isSupported();
4289 } 4314 }
4290 4315
4291 String Document::queryCommandValue(const String& commandName) 4316 String Document::queryCommandValue(const String& commandName, ExceptionState& ex ceptionState)
4292 { 4317 {
4318 if (!isHTMLDocument() && !isXHTMLDocument()) {
4319 exceptionState.throwDOMException(InvalidStateError, "queryCommandValue i s only supported on HTML documents.");
4320 return "";
4321 }
4322
4293 return command(this, commandName).value(); 4323 return command(this, commandName).value();
4294 } 4324 }
4295 4325
4296 KURL Document::openSearchDescriptionURL() 4326 KURL Document::openSearchDescriptionURL()
4297 { 4327 {
4298 static const char openSearchMIMEType[] = "application/opensearchdescription+ xml"; 4328 static const char openSearchMIMEType[] = "application/opensearchdescription+ xml";
4299 static const char openSearchRelation[] = "search"; 4329 static const char openSearchRelation[] = "search";
4300 4330
4301 // FIXME: Why do only top-level frames have openSearchDescriptionURLs? 4331 // FIXME: Why do only top-level frames have openSearchDescriptionURLs?
4302 if (!frame() || frame()->tree().parent()) 4332 if (!frame() || frame()->tree().parent())
(...skipping 1377 matching lines...) Expand 10 before | Expand all | Expand 10 after
5680 #ifndef NDEBUG 5710 #ifndef NDEBUG
5681 using namespace blink; 5711 using namespace blink;
5682 void showLiveDocumentInstances() 5712 void showLiveDocumentInstances()
5683 { 5713 {
5684 WeakDocumentSet& set = liveDocumentSet(); 5714 WeakDocumentSet& set = liveDocumentSet();
5685 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); 5715 fprintf(stderr, "There are %u documents currently alive:\n", set.size());
5686 for (Document* document : set) 5716 for (Document* document : set)
5687 fprintf(stderr, "- Document %p URL: %s\n", document, document->url().str ing().utf8().data()); 5717 fprintf(stderr, "- Document %p URL: %s\n", document, document->url().str ing().utf8().data());
5688 } 5718 }
5689 #endif 5719 #endif
OLDNEW
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Document.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698