| Index: Source/core/dom/Document.cpp | 
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp | 
| index 2fe8f42feedf361a990ffb5bfd1ac881627671fb..cfddc74d2fe18a0e070d10850da96967395d4fc9 100644 | 
| --- a/Source/core/dom/Document.cpp | 
| +++ b/Source/core/dom/Document.cpp | 
| @@ -370,6 +370,31 @@ static void printNavigationErrorMessage(Frame* frame, const KURL& activeURL, con | 
|  | 
| uint64_t Document::s_globalTreeVersion = 0; | 
|  | 
| +// This class should be passed only to Document::postTask. | 
| +class CheckFocusedNodeTask FINAL : public ScriptExecutionContext::Task { | 
| +public: | 
| +    static PassOwnPtr<CheckFocusedNodeTask> create() | 
| +    { | 
| +        return adoptPtr(new CheckFocusedNodeTask()); | 
| +    } | 
| +    virtual ~CheckFocusedNodeTask() { } | 
| + | 
| +private: | 
| +    CheckFocusedNodeTask() { } | 
| +    virtual void performTask(ScriptExecutionContext* context) OVERRIDE | 
| +    { | 
| +        ASSERT(context->isDocument()); | 
| +        Document* document = toDocument(context); | 
| +        document->didRunCheckFocusedNodeTask(); | 
| +        if (!document->focusedNode()) | 
| +            return; | 
| +        if (document->focusedNode()->renderer() && document->focusedNode()->renderer()->needsLayout()) | 
| +            return; | 
| +        if (!document->focusedNode()->isFocusable()) | 
| +            document->setFocusedNode(0); | 
| +    } | 
| +}; | 
| + | 
| Document::Document(Frame* frame, const KURL& url, DocumentClassFlags documentClasses) | 
| : ContainerNode(0, CreateDocument) | 
| , TreeScope(this) | 
| @@ -379,6 +404,7 @@ Document::Document(Frame* frame, const KURL& url, DocumentClassFlags documentCla | 
| , m_contextFeatures(ContextFeatures::defaultSwitch()) | 
| , m_compatibilityMode(NoQuirksMode) | 
| , m_compatibilityModeLocked(false) | 
| +    , m_didPostCheckFocusedNodeTask(false) | 
| , m_domTreeVersion(++s_globalTreeVersion) | 
| , m_mutationObserverTypes(0) | 
| , m_styleSheetCollection(DocumentStyleSheetCollection::create(this)) | 
| @@ -1707,6 +1733,12 @@ void Document::updateLayout() | 
| // Only do a layout if changes have occurred that make it necessary. | 
| if (frameView && renderer() && (frameView->layoutPending() || renderer()->needsLayout())) | 
| frameView->layout(); | 
| + | 
| +    // FIXME: Using a Task doesn't look a good idea. | 
| +    if (m_focusedNode && !m_didPostCheckFocusedNodeTask) { | 
| +        postTask(CheckFocusedNodeTask::create()); | 
| +        m_didPostCheckFocusedNodeTask = true; | 
| +    } | 
| } | 
|  | 
| // FIXME: This is a bad idea and needs to be removed eventually. | 
|  |