diff --git a/ChangeLog b/ChangeLog
index 9c48fac..29b249b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2012-09-20  Vsevolod Vlasov  <vsevik@chromium.org>
+
+        Web Inspector: Provide a way to distinguish scripts having sourceURL from standalone scripts.
+        https://bugs.webkit.org/show_bug.cgi?id=97231
+
+        Reviewed by Pavel Feldman.
+
+        * inspector/debugger/source-url-comment-expected.txt:
+        * inspector/debugger/source-url-comment.html:
+
 2012-10-02  Philip Rogers  <pdr@google.com>
 
         Fix PerfTest standard deviation calculation.
diff --git a/inspector/debugger/source-url-comment-expected.txt b/inspector/debugger/source-url-comment-expected.txt
index 04bbc19..5ee9fb8 100644
--- a/inspector/debugger/source-url-comment-expected.txt
+++ b/inspector/debugger/source-url-comment-expected.txt
@@ -2,8 +2,14 @@
 
 Debugger was enabled.
 
+Running: testSourceURLCommentInInlineScript
+
 Running: testSourceURLComment
 function keepAlive() {}
 //@ sourceURL=evalURL.js
+
+Running: testSourceURLCommentInDynamicScript
+function keepAliveInDynamicScript() {}
+//@ sourceURL=dynamicScriptURL.js
 Debugger was disabled.
 
diff --git a/inspector/debugger/source-url-comment.html b/inspector/debugger/source-url-comment.html
index 1eb28a9..33257ac 100644
--- a/inspector/debugger/source-url-comment.html
+++ b/inspector/debugger/source-url-comment.html
@@ -2,17 +2,57 @@
 <head>
 <script src="../../http/tests/inspector/inspector-test.js"></script>
 <script src="../../http/tests/inspector/debugger-test.js"></script>
-
 <script>
+function keepAliveInInlineScript() { }
 
+//@ sourceURL=inlineScriptURL.js
+</script>
+<script>
 function doEval()
 {
     eval("function keepAlive() {}\n//@ sourceURL=evalURL.js");
 }
 
-function test()
+function doDynamicScript()
 {
+    var scriptElement = document.createElement("script");
+    scriptElement.textContent = "function keepAliveInDynamicScript() {}\n//@ sourceURL=dynamicScriptURL.js";
+    document.body.appendChild(scriptElement);
+}
+
+function test()
+
+{
+    function forEachScriptMatchingURL(url, handler)
+    {
+        var scripts = WebInspector.debuggerModel.scripts;
+        for (var i = 0; i < scripts.length; ++i) {
+            if (scripts[i].sourceURL.indexOf(url) !== -1)
+                handler(scripts[i]);
+        }
+    }
+
     InspectorTest.runDebuggerTestSuite([
+        function testSourceURLCommentInInlineScript(next)
+        {
+            InspectorTest.showScriptSource("source-url-comment.html", didShowScriptSource);
+
+            function didShowScriptSource(sourceFrame)
+            {
+                function checkScriptDoesNotHaveSourceURL(script)
+                {
+                    InspectorTest.assertTrue(!script.hasSourceURL, "hasSourceURL flag is set for inline script");
+                }
+
+                var panel = WebInspector.panel("scripts");
+                var uiSourceCodes = panel._workspace.uiSourceCodes();
+                for (var i = 0; i < uiSourceCodes.length; ++i)
+                    InspectorTest.assertTrue(uiSourceCodes[i].url.indexOf("inlineScriptURL.js") === -1, "sourceURL comment in inline script was used as a script name");
+                forEachScriptMatchingURL("source-url-comment.html", checkScriptDoesNotHaveSourceURL)
+                next();
+            }
+        },
+
         function testSourceURLComment(next)
         {
             InspectorTest.showScriptSource("evalURL.js", didShowScriptSource);
@@ -20,7 +60,31 @@
 
             function didShowScriptSource(sourceFrame)
             {
+                function checkScriptHasSourceURL(script)
+                {
+                    InspectorTest.assertTrue(script.hasSourceURL, "hasSourceURL flag is not set for eval with sourceURL comment");
+                }
+
                 InspectorTest.addResult(sourceFrame.textEditor.text());
+                forEachScriptMatchingURL("evalURL.js", checkScriptHasSourceURL);
+                next();
+            }
+        },
+
+        function testSourceURLCommentInDynamicScript(next)
+        {
+            InspectorTest.showScriptSource("dynamicScriptURL.js", didShowScriptSource);
+            InspectorTest.evaluateInPage("setTimeout(doDynamicScript, 0)");
+
+            function didShowScriptSource(sourceFrame)
+            {
+                function checkScriptHasSourceURL(script)
+                {
+                    InspectorTest.assertTrue(script.hasSourceURL, "hasSourceURL flag is not set for dynamic script with sourceURL comment");
+                }
+
+                InspectorTest.addResult(sourceFrame.textEditor.text());
+                forEachScriptMatchingURL("dynamicScriptURL.js", checkScriptHasSourceURL);
                 next();
             }
         }
