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

Side by Side Diff: Source/bindings/v8/ScriptController.cpp

Issue 13575004: Apply script preprocessor to Web page scripts only. (Closed) Base URL: https://chromium.googlesource.com/external/WebKit_trimmed.git@master
Patch Set: respond to haraken comment #35 Created 7 years, 5 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2008, 2009 Google Inc. All rights reserved.
3 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Apple Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 20 matching lines...) Expand all
31 31
32 #include "config.h" 32 #include "config.h"
33 #include "bindings/v8/ScriptController.h" 33 #include "bindings/v8/ScriptController.h"
34 34
35 #include "V8Event.h" 35 #include "V8Event.h"
36 #include "V8HTMLElement.h" 36 #include "V8HTMLElement.h"
37 #include "V8Window.h" 37 #include "V8Window.h"
38 #include "bindings/v8/BindingSecurity.h" 38 #include "bindings/v8/BindingSecurity.h"
39 #include "bindings/v8/NPV8Object.h" 39 #include "bindings/v8/NPV8Object.h"
40 #include "bindings/v8/ScriptCallStackFactory.h" 40 #include "bindings/v8/ScriptCallStackFactory.h"
41 #include "bindings/v8/ScriptPreprocessor.h"
41 #include "bindings/v8/ScriptSourceCode.h" 42 #include "bindings/v8/ScriptSourceCode.h"
42 #include "bindings/v8/ScriptValue.h" 43 #include "bindings/v8/ScriptValue.h"
43 #include "bindings/v8/V8Binding.h" 44 #include "bindings/v8/V8Binding.h"
44 #include "bindings/v8/V8GCController.h" 45 #include "bindings/v8/V8GCController.h"
45 #include "bindings/v8/V8HiddenPropertyName.h" 46 #include "bindings/v8/V8HiddenPropertyName.h"
46 #include "bindings/v8/V8NPObject.h" 47 #include "bindings/v8/V8NPObject.h"
47 #include "bindings/v8/V8PerContextData.h" 48 #include "bindings/v8/V8PerContextData.h"
48 #include "bindings/v8/V8ScriptRunner.h" 49 #include "bindings/v8/V8ScriptRunner.h"
49 #include "bindings/v8/V8WindowShell.h" 50 #include "bindings/v8/V8WindowShell.h"
50 #include "bindings/v8/npruntime_impl.h" 51 #include "bindings/v8/npruntime_impl.h"
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 509
509 void ScriptController::clearWindowShell() 510 void ScriptController::clearWindowShell()
510 { 511 {
511 double start = currentTime(); 512 double start = currentTime();
512 // V8 binding expects ScriptController::clearWindowShell only be called 513 // V8 binding expects ScriptController::clearWindowShell only be called
513 // when a frame is loading a new page. This creates a new context for the ne w page. 514 // when a frame is loading a new page. This creates a new context for the ne w page.
514 m_windowShell->clearForNavigation(); 515 m_windowShell->clearForNavigation();
515 for (IsolatedWorldMap::iterator iter = m_isolatedWorlds.begin(); iter != m_i solatedWorlds.end(); ++iter) 516 for (IsolatedWorldMap::iterator iter = m_isolatedWorlds.begin(); iter != m_i solatedWorlds.end(); ++iter)
516 iter->value->clearForNavigation(); 517 iter->value->clearForNavigation();
517 V8GCController::hintForCollectGarbage(); 518 V8GCController::hintForCollectGarbage();
519 clearScriptPreprocessor();
518 HistogramSupport::histogramCustomCounts("WebCore.ScriptController.clearWindo wShell", (currentTime() - start) * 1000, 0, 10000, 50); 520 HistogramSupport::histogramCustomCounts("WebCore.ScriptController.clearWindo wShell", (currentTime() - start) * 1000, 0, 10000, 50);
519 } 521 }
520 522
521 void ScriptController::setCaptureCallStackForUncaughtExceptions(bool value) 523 void ScriptController::setCaptureCallStackForUncaughtExceptions(bool value)
522 { 524 {
523 v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::ma xCallStackSizeToCapture, stackTraceOptions); 525 v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::ma xCallStackSizeToCapture, stackTraceOptions);
524 } 526 }
525 527
526 void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se curityOrigin*> >& result) 528 void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se curityOrigin*> >& result)
527 { 529 {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 641
640 String scriptResult; 642 String scriptResult;
641 if (!result.getString(scriptResult)) 643 if (!result.getString(scriptResult))
642 return true; 644 return true;
643 645
644 // We're still in a frame, so there should be a DocumentLoader. 646 // We're still in a frame, so there should be a DocumentLoader.
645 ASSERT(m_frame->document()->loader()); 647 ASSERT(m_frame->document()->loader());
646 648
647 if (!locationChangeBefore && m_frame->navigationScheduler()->locationChangeP ending()) 649 if (!locationChangeBefore && m_frame->navigationScheduler()->locationChangeP ending())
648 return true; 650 return true;
649 651
650 // DocumentWriter::replaceDocument can cause the DocumentLoader to get deref 'ed and possible destroyed, 652 // DocumentWriter::replaceDocument can cause the DocumentLoader to get deref 'ed and possible destroyed,
651 // so protect it with a RefPtr. 653 // so protect it with a RefPtr.
652 if (RefPtr<DocumentLoader> loader = m_frame->document()->loader()) 654 if (RefPtr<DocumentLoader> loader = m_frame->document()->loader())
653 loader->replaceDocument(scriptResult, ownerDocument.get()); 655 loader->replaceDocument(scriptResult, ownerDocument.get());
654 return true; 656 return true;
655 } 657 }
656 658
657 ScriptValue ScriptController::executeScriptInMainWorld(const ScriptSourceCode& s ourceCode) 659 ScriptValue ScriptController::executeScriptInMainWorld(const ScriptSourceCode& s ourceCode)
658 { 660 {
659 String sourceURL = sourceCode.url(); 661 String sourceURL = sourceCode.url();
660 const String* savedSourceURL = m_sourceURL; 662 const String* savedSourceURL = m_sourceURL;
661 m_sourceURL = &sourceURL; 663 m_sourceURL = &sourceURL;
662 664
663 v8::HandleScope handleScope; 665 v8::HandleScope handleScope;
664 v8::Handle<v8::Context> v8Context = ScriptController::mainWorldContext(m_fra me); 666 v8::Handle<v8::Context> v8Context = ScriptController::mainWorldContext(m_fra me);
665 if (v8Context.IsEmpty()) 667 if (v8Context.IsEmpty())
666 return ScriptValue(); 668 return ScriptValue();
667 669
670 String processedString = preprocess(sourceCode.source(), sourceURL);
671 ScriptSourceCode processedSourceCode(processedString, sourceCode.url(), sour ceCode.startPosition());
672
668 v8::Context::Scope scope(v8Context); 673 v8::Context::Scope scope(v8Context);
669 RefPtr<Frame> protect(m_frame); 674 RefPtr<Frame> protect(m_frame);
670 v8::Local<v8::Value> object = compileAndRunScript(sourceCode); 675 v8::Local<v8::Value> object = compileAndRunScript(processedSourceCode);
671 676
672 m_sourceURL = savedSourceURL; 677 m_sourceURL = savedSourceURL;
673 678
674 if (object.IsEmpty()) 679 if (object.IsEmpty())
675 return ScriptValue(); 680 return ScriptValue();
676 681
677 return ScriptValue(object); 682 return ScriptValue(object);
678 } 683 }
679 684
680 void ScriptController::executeScriptInIsolatedWorld(int worldID, const Vector<Sc riptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) 685 void ScriptController::executeScriptInIsolatedWorld(int worldID, const Vector<Sc riptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results)
(...skipping 23 matching lines...) Expand all
704 709
705 v8Results = evaluateHandleScope.Close(resultArray); 710 v8Results = evaluateHandleScope.Close(resultArray);
706 } 711 }
707 712
708 if (results && !v8Results.IsEmpty()) { 713 if (results && !v8Results.IsEmpty()) {
709 for (size_t i = 0; i < v8Results->Length(); ++i) 714 for (size_t i = 0; i < v8Results->Length(); ++i)
710 results->append(ScriptValue(v8Results->Get(i))); 715 results->append(ScriptValue(v8Results->Get(i)));
711 } 716 }
712 } 717 }
713 718
719 void ScriptController::setScriptPreprocessor(const String& preprocessorBody)
720 {
721 // We delay the creation of the preprocess until just before the first JS fr om the
722 // Web page to ensure that the debugger's console initialization code has co mpleted.
723 m_preprocessorSource = preprocessorBody;
724 }
725
726 void ScriptController::clearScriptPreprocessor()
727 {
728 m_scriptPreprocessor.clear();
729 m_preprocessorSource = String();
730 }
731
732 // Source to Source processing iff debugger enabled and it has loaded a preproce ssor.
733 String ScriptController::preprocess(const String& scriptSource, const String& sc riptName)
haraken 2013/07/12 00:13:19 Just to confirm: preprocess() does nothing when a
abarth-chromium 2013/07/12 00:25:16 Yeah, m_preprocessorSource will be null.
734 {
735 if (m_preprocessorSource.isEmpty())
736 return scriptSource;
737
738 if (!m_frame->page())
739 return scriptSource;
740
741 if (!m_scriptPreprocessor)
742 m_scriptPreprocessor = adoptPtr(new ScriptPreprocessor(m_preprocessorSou rce, this, m_frame->page()->console()));
743
744 return m_scriptPreprocessor->preprocessSourceCode(scriptSource, scriptName);
745 }
746
747 void ScriptController::preprocessEval(ScriptDebugServer* debugServer, v8::Handle <v8::Object> eventData)
748 {
749 if (!m_scriptPreprocessor.get())
750 return;
751 m_scriptPreprocessor->preprocessEval(debugServer, eventData);
752 }
753
714 } // namespace WebCore 754 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698