00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_AUTOMATIC_PUBLIC_BLINK_FLOW_H_
00020 #define NET_INSTAWEB_AUTOMATIC_PUBLIC_BLINK_FLOW_H_
00021
00022 #include "net/instaweb/rewriter/public/blink_util.h"
00023 #include "net/instaweb/util/public/basictypes.h"
00024 #include "net/instaweb/util/public/string.h"
00025 #include "net/instaweb/util/public/string_util.h"
00026
00027 namespace net_instaweb {
00028
00029 class AsyncFetch;
00030 class Layout;
00031 class ProxyFetchFactory;
00032 class ResponseHeaders;
00033 class ResourceManager;
00034 class RewriteOptions;
00035 class Statistics;
00036 class TimedVariable;
00037
00041 class BlinkFlow {
00042 public:
00043 static void Start(const GoogleString& url,
00044 AsyncFetch* base_fetch,
00045 const Layout* layout,
00046 RewriteOptions* options,
00047 ProxyFetchFactory* factory,
00048 ResourceManager* manager);
00049
00050 virtual ~BlinkFlow();
00051
00052 static void Initialize(Statistics* statistics);
00053
00055 static const char kNumSharedJsonFetchesStarted[];
00056 static const char kNumSharedJsonFetchesComplete[];
00057 static const char kAboveTheFold[];
00058
00059 private:
00060 class JsonFindCallback;
00061 friend class JsonFindCallback;
00062
00064 BlinkFlow(const GoogleString& url,
00065 AsyncFetch* base_fetch,
00066 const Layout* layout,
00067 RewriteOptions* options,
00068 ProxyFetchFactory* factory,
00069 ResourceManager* manager);
00070
00071 void InitiateJsonLookup();
00072
00073 void JsonCacheHit(const StringPiece& content,
00074 const ResponseHeaders& headers);
00075
00076 void JsonCacheMiss();
00077
00078 void TriggerProxyFetch(bool layout_found);
00079
00080 void ServeAllPanelContents(const Json::Value& json,
00081 const PanelIdToSpecMap& panel_id_to_spec);
00082
00083 void ServeCriticalPanelContents(const Json::Value& json,
00084 const PanelIdToSpecMap& panel_id_to_spec);
00085
00086 void SendLayout(const StringPiece& str);
00087
00088 void SendCriticalJson(GoogleString* critical_json_str);
00089
00090 void SendInlineImagesJson(GoogleString* pushed_images_str);
00091
00092 void SendNonCriticalJson(GoogleString* non_critical_json_str);
00093
00094 void EscapeString(GoogleString* str) const;
00095
00096 void WriteString(const StringPiece& str);
00097
00098 void Flush();
00099
00100 int64 GetTimeElapsedFromStartRequest();
00101
00102 GoogleString GetAddTimingScriptString(const GoogleString& timing_str,
00103 int64 time_ms);
00104
00105 void SetFilterOptions(RewriteOptions* options) const;
00106
00107 GoogleString url_;
00108 AsyncFetch* base_fetch_;
00109 const Layout* layout_;
00110 RewriteOptions* options_;
00111 ProxyFetchFactory* factory_;
00112 ResourceManager* manager_;
00113 TimedVariable* num_shared_json_fetches_started_;
00114 GoogleString json_url_;
00115 int64 request_start_time_ms_;
00116 int64 time_to_start_blink_flow_ms_;
00117 int64 time_to_json_lookup_done_ms_;
00118 int64 time_to_split_critical_ms_;
00119
00120 DISALLOW_COPY_AND_ASSIGN(BlinkFlow);
00121 };
00122
00123 }
00124
00125 #endif ///< NET_INSTAWEB_AUTOMATIC_PUBLIC_BLINK_FLOW_H_