flutter_flutter/engine/core/html/parser/HTMLScriptRunner.cpp
Adam Barth 8385799d73 Fix line numbers in JavaScript stack traces
Instead of calling the function constructor to compile script in Sky, we now
concatenate strings. This has the advantage of making the line numbers
generated in error messages correct but the disadvantage of being a hack. I've
filed https://code.google.com/p/v8/issues/detail?id=3624 to request a proper
API for this purpose.

R=esprehn@chromium.org

Review URL: https://codereview.chromium.org/688033003
2014-10-29 14:00:57 -07:00

67 lines
1.7 KiB
C++

// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/html/parser/HTMLScriptRunner.h"
#include "bindings/core/v8/ScriptController.h"
#include "core/dom/Document.h"
#include "core/dom/Microtask.h"
#include "core/frame/LocalFrame.h"
#include "core/html/HTMLScriptElement.h"
namespace blink {
HTMLScriptRunner::HTMLScriptRunner()
: m_isExecutingScript(false)
{
}
HTMLScriptRunner::~HTMLScriptRunner()
{
}
void HTMLScriptRunner::runScript(PassRefPtr<HTMLScriptElement> element, TextPosition textPosition)
{
ASSERT(!hasPendingScripts());
if (!element->document().isScriptExecutionReady()) {
m_pendingScript = element;
m_textPosition = textPosition;
return;
}
executeScript(element, textPosition);
}
void HTMLScriptRunner::executePendingScripts()
{
executeScript(m_pendingScript.release(), m_textPosition);
}
void HTMLScriptRunner::executeScript(PassRefPtr<HTMLScriptElement> element, TextPosition textPosition)
{
Microtask::performCheckpoint();
Document& sourceDocument = element->document();
String source = element->textContent();
RefPtr<Document> contextDocument = sourceDocument.contextDocument().get();
if (!contextDocument)
return;
LocalFrame* frame = contextDocument->frame();
if (!frame)
return;
ASSERT(!m_isExecutingScript);
TemporaryChange<bool> executingScript(m_isExecutingScript, true);
contextDocument->pushCurrentScript(element);
frame->script().executeModuleScript(sourceDocument, source, textPosition);
contextDocument->popCurrentScript();
}
}