text: // Copyright 2016 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.
  
  #ifndef DocumentWriteEvaluator_h
  #define DocumentWriteEvaluator_h
  
  #include "bindings/core/v8/V8Binding.h"
  #include "core/dom/Document.h"
  #include "core/frame/Navigator.h"
  #include "core/html/parser/CompactHTMLToken.h"
  #include "core/html/parser/HTMLToken.h"
  #include "core/html/parser/HTMLTokenizer.h"
  
  namespace blink {
  
  // This class is used by the preload scanner on the background parser thread to
  // execute inline Javascript and preload resources that would have been written
  // by document.write(). It takes a script string and outputs a vector of start
  // tag tokens.
  class CORE_EXPORT DocumentWriteEvaluator {
      WTF_MAKE_NONCOPYABLE(DocumentWriteEvaluator);
      USING_FAST_MALLOC(DocumentWriteEvaluator);
  
  public:
      // For unit testing.
      DocumentWriteEvaluator(const String& pathName, const String& hostName, const String& protocol, const String& userAgent);
  
      static PassOwnPtr<DocumentWriteEvaluator> create(const Document& document)
      {
          return adoptPtr(new DocumentWriteEvaluator(document));
      }
      virtual ~DocumentWriteEvaluator();
  
      // Initializes the V8 context for this document. Returns whether
      // initialization was needed.
      bool ensureEvaluationContext();
      String evaluateAndEmitWrittenSource(const String& scriptSource);
      bool shouldEvaluate(const String& scriptSource);
  
      void recordDocumentWrite(const String& documentWrittenString);
  
  private:
      explicit DocumentWriteEvaluator(const Document&);
      // Returns true if the evaluation succeeded with no errors.
      bool evaluate(const String& scriptSource);
  
      // All the strings that are document.written in the script tag that is being
      // scanned.
      StringBuilder m_documentWrittenStrings;
  
      ScopedPersistent<v8::Context> m_persistentContext;
      ScopedPersistent<v8::Object> m_window;
      ScopedPersistent<v8::Object> m_document;
      ScopedPersistent<v8::Object> m_location;
      ScopedPersistent<v8::Object> m_navigator;
  
      String m_pathName;
      String m_hostName;
      String m_protocol;
      String m_userAgent;
  };
  
  } // namespace blink
  
  #endif // DocumentWriteEvaluator_h
  