1 /*
   2  * Copyright (C) 2013 Apple Inc. All rights reserved.
   3  *
   4  * Redistribution and use in source and binary forms, with or without
   5  * modification, are permitted provided that the following conditions
   6  * are met:
   7  * 1. Redistributions of source code must retain the above copyright
   8  *    notice, this list of conditions and the following disclaimer.
   9  * 2. Redistributions in binary form must reproduce the above copyright
  10  *    notice, this list of conditions and the following disclaimer in the
  11  *    documentation and/or other materials provided with the distribution.
  12  *
  13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
  14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
  17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24  */
  25 
  26 #include "config.h"
  27 #include "WebInjectedScriptManager.h"
  28 
  29 #include "CommandLineAPIModule.h"
  30 #include "ScriptState.h"
  31 
  32 using namespace Inspector;
  33 
  34 namespace WebCore {
  35 
  36 WebInjectedScriptManager::WebInjectedScriptManager(InspectorEnvironment& environment, PassRefPtr<InjectedScriptHost> host)
  37     : InjectedScriptManager(environment, host)
  38     , m_commandLineAPIHost(CommandLineAPIHost::create())
  39 {
  40 }
  41 
  42 void WebInjectedScriptManager::disconnect()
  43 {
  44     InjectedScriptManager::disconnect();
  45 
  46     m_commandLineAPIHost->disconnect();
  47     m_commandLineAPIHost = nullptr;
  48 }
  49 
  50 void WebInjectedScriptManager::didCreateInjectedScript(InjectedScript injectedScript)
  51 {
  52     CommandLineAPIModule::injectIfNeeded(this, injectedScript);
  53 }
  54 
  55 void WebInjectedScriptManager::discardInjectedScriptsFor(DOMWindow* window)
  56 {
  57     if (m_scriptStateToId.isEmpty())
  58         return;
  59 
  60     Vector<long> idsToRemove;
  61     for (const auto& it : m_idToInjectedScript) {
  62         JSC::ExecState* scriptState = it.value.scriptState();
  63         // JDK-8164076
  64         if (scriptState == nullptr || window != domWindowFromExecState(scriptState))
  65             continue;
  66         m_scriptStateToId.remove(scriptState);
  67         idsToRemove.append(it.key);
  68     }
  69 
  70     for (size_t i = 0; i < idsToRemove.size(); i++)
  71         m_idToInjectedScript.remove(idsToRemove[i]);
  72 
  73     // Now remove script states that have id but no injected script.
  74     Vector<JSC::ExecState*> scriptStatesToRemove;
  75     for (const auto& it : m_scriptStateToId) {
  76         JSC::ExecState* scriptState = it.key;
  77         if (window == domWindowFromExecState(scriptState))
  78             scriptStatesToRemove.append(scriptState);
  79     }
  80 
  81     for (size_t i = 0; i < scriptStatesToRemove.size(); i++)
  82         m_scriptStateToId.remove(scriptStatesToRemove[i]);
  83 }
  84 
  85 } // namespace WebCore