Home | History | Annotate | Download | only in js
      1 /*
      2  * Copyright (C) 2010 Google 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 are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 /**
     32  * @fileoverview Injects "injected" object into the inspectable page.
     33  */
     34 
     35 
     36 var InspectorControllerDispatcher = {};
     37 
     38 /**
     39  * Main dispatch method, all calls from the host to InspectorController go
     40  * through this one.
     41  * @param {string} functionName Function to call
     42  * @param {string} json_args JSON-serialized call parameters.
     43  * @return {string} JSON-serialized result of the dispatched call.
     44  */
     45 InspectorControllerDispatcher.dispatch = function(functionName, json_args)
     46 {
     47     var params = JSON.parse(json_args);
     48     InspectorBackend[functionName].apply(InspectorBackend, params);
     49 };
     50 
     51 /**
     52  * Special controller object for APU related messages. Outgoing messages
     53  * are sent to this object if the ApuAgentDispatcher is enabled.
     54  **/
     55 var ApuAgentDispatcher = { enabled : false };
     56 
     57 /**
     58  * Dispatches messages to APU. This filters and transforms
     59  * outgoing messages that are used by APU.
     60  * @param {string} method name of the dispatch method.
     61  **/
     62 ApuAgentDispatcher.dispatchToApu = function(method, args)
     63 {
     64     if (method !== "addRecordToTimeline" && method !== "updateResource" && method !== "addResource")
     65         return;
     66     // TODO(knorton): Transform args so they can be used
     67     // by APU.
     68     DevToolsAgentHost.dispatchToApu(JSON.stringify(args));
     69 };
     70 
     71 /**
     72  * This is called by the InspectorFrontend for serialization.
     73  * We serialize the call and send it to the client over the IPC
     74  * using dispatchOut bound method.
     75  */
     76 function dispatch(method, var_args) {
     77     // Handle all messages with non-primitieve arguments here.
     78     var args = Array.prototype.slice.call(arguments);
     79 
     80     if (method === "inspectedWindowCleared" || method === "reset" || method === "setAttachedWindow") {
     81         // Filter out messages we don't need here.
     82         // We do it on the sender side since they may have non-serializable
     83         // parameters.
     84         return;
     85     }
     86 
     87     // Sniff some inspector controller state changes in order to support
     88     // cross-navigation instrumentation. Keep names in sync with
     89     // webdevtoolsagent_impl.
     90     if (method === "timelineProfilerWasStarted")
     91         DevToolsAgentHost.runtimeFeatureStateChanged("timeline-profiler", true);
     92     else if (method === "timelineProfilerWasStopped")
     93         DevToolsAgentHost.runtimeFeatureStateChanged("timeline-profiler", false);
     94     else if (method === "resourceTrackingWasEnabled")
     95         DevToolsAgentHost.runtimeFeatureStateChanged("resource-tracking", true);
     96     else if (method === "resourceTrackingWasDisabled")
     97         DevToolsAgentHost.runtimeFeatureStateChanged("resource-tracking", false);
     98 
     99     if (ApuAgentDispatcher.enabled) {
    100         ApuAgentDispatcher.dispatchToApu(method, args);
    101         return;
    102     }
    103 
    104     var call = JSON.stringify(args);
    105     DevToolsAgentHost.dispatch(call);
    106 };
    107