00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_OPTIONS_H_
00020 #define NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_OPTIONS_H_
00021
00022 #include <set>
00023 #include <vector>
00024
00025 #include "base/logging.h"
00026 #include "base/scoped_ptr.h"
00027 #include "net/instaweb/rewriter/public/domain_lawyer.h"
00028 #include "net/instaweb/rewriter/public/file_load_policy.h"
00029 #include "net/instaweb/util/public/basictypes.h"
00030 #include "net/instaweb/util/public/string.h"
00031 #include "net/instaweb/util/public/string_util.h"
00032 #include "net/instaweb/util/public/thread_system.h"
00033 #include "net/instaweb/util/public/wildcard_group.h"
00034
00035 namespace net_instaweb {
00036
00037 class Hasher;
00038 class MessageHandler;
00039 class PublisherConfig;
00040
00041 class RewriteOptions {
00042 public:
00045 enum Filter {
00046 kAddBaseTag,
00047 kAddHead,
00048 kAddInstrumentation,
00049 kCollapseWhitespace,
00050 kCombineCss,
00051 kCombineHeads,
00052 kCombineJavascript,
00053 kComputePanelJson,
00054 kConvertJpegToProgressive,
00055 kConvertJpegToWebp,
00056 kConvertMetaTags,
00057 kConvertPngToJpeg,
00058 kDebug,
00059 kDeferJavascript,
00060 kDelayImages,
00061 kDetectReflowWithDeferJavascript,
00062 kDeterministicJs,
00063 kDisableJavascript,
00064 kDivStructure,
00065 kElideAttributes,
00066 kExplicitCloseTags,
00067 kExtendCacheCss,
00068 kExtendCacheImages,
00069 kExtendCacheScripts,
00070 kFlattenCssImports,
00071 kHtmlWriterFilter,
00072 kInlineCss,
00073 kInlineImages,
00074 kInlineImportToLink,
00075 kInlineJavascript,
00076 kInsertGA,
00077 kInsertImageDimensions,
00078 kLazyloadImages,
00079 kLeftTrimUrls,
00080 kLocalStorageCache,
00081 kMakeGoogleAnalyticsAsync,
00082 kMoveCssAboveScripts,
00083 kMoveCssToHead,
00084 kOutlineCss,
00085 kOutlineJavascript,
00086 kPrioritizeVisibleContent,
00087 kRecompressImages,
00088 kRemoveComments,
00089 kRemoveQuotes,
00090 kResizeImages,
00091 kResizeMobileImages,
00092 kRewriteCss,
00093 kRewriteDomains,
00094 kRewriteJavascript,
00095 kRewriteStyleAttributes,
00096 kRewriteStyleAttributesWithUrl,
00097 kServeNonCacheableNonCritical,
00098 kSpriteImages,
00099 kStripNonCacheable,
00100 kStripScripts,
00101 kEndOfFilters
00102 };
00103
00106 enum OptionEnum {
00107 kAjaxRewritingEnabled,
00108 kAlwaysRewriteCss,
00109 kAnalyticsID,
00110 kAvoidRenamingIntrospectiveJavascript,
00111 kBeaconUrl,
00112 kBlinkDesktopUserAgent,
00113 kBotdetectEnabled,
00114 kCacheInvalidationTimestamp,
00115 kCombineAcrossPaths,
00116 kCriticalImagesCacheExpirationTimeMs,
00117 kCssImageInlineMaxBytes,
00118 kCssInlineMaxBytes,
00119 kCssOutlineMinBytes,
00120 kDefaultCacheHtml,
00121 kDomainRewriteHyperlinks,
00122 kEnableBlinkCriticalLine,
00123 kEnableBlinkForMobileDevices,
00124 kEnabled,
00125 kEnableDeferJsExperimental,
00126 kFlushHtml,
00127 kFuriousSlot,
00128 kIdleFlushTimeMs,
00129 kImageInlineMaxBytes,
00130 kImageJpegNumProgressiveScans,
00131 kImageJpegRecompressionQuality,
00132 kImageLimitOptimizedPercent,
00133 kImageLimitResizeAreaPercent,
00134 kImageMaxRewritesAtOnce,
00135 kImageRetainColorProfile,
00136 kImageRetainColorSampling,
00137 kImageRetainExifData,
00138 kImageWebpRecompressQuality,
00139 kImplicitCacheTtlMs,
00140 kIncreaseSpeedTracking,
00141 kJsInlineMaxBytes,
00142 kJsOutlineMinBytes,
00143 kLazyloadImagesAfterOnload,
00144 kLogRewriteTiming,
00145 kLowercaseHtmlNames,
00146 kMaxHtmlCacheTimeMs,
00147 kMaxImageSizeLowResolutionBytes,
00148 kMaxInlinedPreviewImagesIndex,
00149 kMaxUrlSegmentSize,
00150 kMaxUrlSize,
00151 kMinImageSizeLowResolutionBytes,
00152 kMinResourceCacheTimeToRewriteMs,
00153 kModifyCachingHeaders,
00154 kPrioritizeVisibleContentCacheTime,
00155 kPrioritizeVisibleContentNonCacheableElements,
00156 kProgressiveJpegMinBytes,
00157 kReportUnloadTime,
00158 kRespectVary,
00159 kRewriteLevel,
00160 kRunningFurious,
00161 kServeBlinkNonCritical,
00162 kServeStaleIfFetchError,
00163 kUseFixedUserAgentForBlinkCacheMisses,
00164 kXModPagespeedHeaderValue,
00165
00167 kCollectRefererStatistics,
00168 kFetcherProxy,
00169 kFetcherTimeOutMs,
00170 kFileCacheCleanIntervalMs,
00171 kFileCacheCleanSizeKb,
00172 kFileCachePath,
00173 kFileNamePrefix,
00174 kHashRefererStatistics,
00175 kLruCacheByteLimit,
00176 kLruCacheKbPerProcess,
00177 kMessageBufferSize,
00178 kRefererStatisticsOutputLevel,
00179 kSlurpDirectory,
00180 kSlurpFlushLimit,
00181 kSlurpReadOnly,
00182 kStatisticsEnabled,
00183 kTestProxy,
00184 kUseSharedMemLocking,
00185
00187 kEndOfOptions
00188 };
00189
00190 struct BeaconUrl {
00191 GoogleString http;
00192 GoogleString https;
00193 };
00194
00195 static const char kAjaxRewriteId[];
00196 static const char kCssCombinerId[];
00197 static const char kCssFilterId[];
00198 static const char kCssImportFlattenerId[];
00199 static const char kCssInlineId[];
00200 static const char kCacheExtenderId[];
00201 static const char kImageCombineId[];
00202 static const char kImageCompressionId[];
00203 static const char kJavascriptCombinerId[];
00204 static const char kJavascriptInlineId[];
00205 static const char kLocalStorageCacheId[];
00206 static const char kJavascriptMinId[];
00207
00208 static const char kPanelCommentPrefix[];
00209
00212 static const char* FilterName(Filter filter);
00213
00216 static const char* FilterId(Filter filter);
00217
00219 static const Filter kFirstFilter = kAddBaseTag;
00220
00222 typedef std::set<Filter> FilterSet;
00223
00224 enum RewriteLevel {
00229 kPassThrough,
00230
00236 kCoreFilters,
00237
00241 kTestingCoreFilters,
00242
00245 kAllFilters,
00246 };
00247
00249 enum OptionSettingResult {
00250 kOptionOk,
00251 kOptionNameUnknown,
00252 kOptionValueInvalid
00253 };
00254
00255 static const int64 kDefaultCssInlineMaxBytes;
00256 static const int64 kDefaultImageInlineMaxBytes;
00257 static const int64 kDefaultCssImageInlineMaxBytes;
00258 static const int64 kDefaultJsInlineMaxBytes;
00259 static const int64 kDefaultCssOutlineMinBytes;
00260 static const int64 kDefaultJsOutlineMinBytes;
00261 static const int64 kDefaultProgressiveJpegMinBytes;
00262 static const int64 kDefaultMaxHtmlCacheTimeMs;
00263 static const int64 kDefaultMinResourceCacheTimeToRewriteMs;
00264 static const int64 kDefaultCacheInvalidationTimestamp;
00265 static const int64 kDefaultIdleFlushTimeMs;
00266 static const int64 kDefaultImplicitCacheTtlMs;
00267 static const int64 kDefaultPrioritizeVisibleContentCacheTimeMs;
00268 static const char kDefaultBeaconUrl[];
00269 static const int kDefaultImageJpegRecompressQuality;
00270 static const int kDefaultImageLimitOptimizedPercent;
00271 static const int kDefaultImageLimitResizeAreaPercent;
00272 static const int kDefaultImageJpegNumProgressiveScans;
00273 static const int kDefaultImageWebpRecompressQuality;
00274
00277 static const int kDefaultMaxUrlSize;
00278
00279 static const int kDefaultImageMaxRewritesAtOnce;
00280
00285 static const int kDefaultMaxUrlSegmentSize;
00286
00289 static const int kDefaultMaxInlinedPreviewImagesIndex;
00292 static const int64 kDefaultMinImageSizeLowResolutionBytes;
00295 static const int64 kDefaultMaxImageSizeLowResolutionBytes;
00297 static const int64 kDefaultCriticalImagesCacheExpirationMs;
00298
00301 static const int64 kDefaultMetadataCacheStalenessThresholdMs;
00302
00303 static const int kDefaultFuriousTrafficPercent;
00305 static const int kDefaultFuriousSlot;
00306
00307 static const char kClassName[];
00308
00309 static const char kDefaultXModPagespeedHeaderValue[];
00310
00311 static const char kDefaultBlinkDesktopUserAgentValue[];
00312
00321 class FuriousSpec {
00322 public:
00327 FuriousSpec(const StringPiece& spec, RewriteOptions* options,
00328 MessageHandler* handler);
00329
00333 explicit FuriousSpec(int id);
00334
00335 ~FuriousSpec() {}
00336
00338 FuriousSpec* Clone();
00339
00340 bool is_valid() const { return id_ >= 0; }
00341
00343 int id() const { return id_; }
00344 int percent() const { return percent_; }
00345 GoogleString ga_id() const { return ga_id_; }
00346 int slot() const { return ga_variable_slot_; }
00347 RewriteLevel rewrite_level() const { return rewrite_level_; }
00348 FilterSet enabled_filters() const { return enabled_filters_; }
00349 FilterSet disabled_filters() const { return disabled_filters_; }
00350 int64 css_inline_max_bytes() const { return css_inline_max_bytes_; }
00351 int64 js_inline_max_bytes() const { return js_inline_max_bytes_; }
00352 int64 image_inline_max_bytes() const { return image_inline_max_bytes_; }
00353 bool use_default() const { return use_default_; }
00354
00355 private:
00358 void Initialize(const StringPiece& spec, MessageHandler* handler);
00359
00361 static StringPiece PieceAfterEquals(const StringPiece& piece);
00362
00363 int id_;
00364 GoogleString ga_id_;
00365 int ga_variable_slot_;
00366 int percent_;
00367 RewriteLevel rewrite_level_;
00368 FilterSet enabled_filters_;
00369 FilterSet disabled_filters_;
00370 int64 css_inline_max_bytes_;
00371 int64 js_inline_max_bytes_;
00372 int64 image_inline_max_bytes_;
00375 bool use_default_;
00376 DISALLOW_COPY_AND_ASSIGN(FuriousSpec);
00377 };
00378
00379 static bool ParseRewriteLevel(const StringPiece& in, RewriteLevel* out);
00380
00384 static bool ParseBeaconUrl(const StringPiece& in, BeaconUrl* out);
00385
00386 RewriteOptions();
00387 virtual ~RewriteOptions();
00388
00390 static void Initialize();
00391
00392 bool modified() const { return modified_; }
00393
00394 void SetDefaultRewriteLevel(RewriteLevel level) {
00396 level_.set_default(level);
00397 }
00398 void SetRewriteLevel(RewriteLevel level) {
00399 set_option(level, &level_);
00400 }
00401
00404 FuriousSpec* GetFuriousSpec(int id) const;
00405
00409 bool AvailableFuriousId(int id);
00410
00413 bool AddFuriousSpec(const StringPiece& spec, MessageHandler* handler);
00414
00417 bool AddFuriousSpec(int furious_id);
00418
00422 bool AddFuriousSpec(FuriousSpec* spec);
00423
00430 void SetFuriousState(int id);
00431
00432 int furious_id() const { return furious_id_; }
00433
00434 int furious_spec_id(int i) const {
00435 return furious_specs_[i]->id();
00436 }
00437
00438 FuriousSpec* furious_spec(int i) const {
00439 return furious_specs_[i];
00440 }
00441
00442 int num_furious_experiments() const { return furious_specs_.size(); }
00443
00444 RewriteLevel level() const { return level_.value();}
00445
00450 bool AdjustFiltersByCommaSeparatedList(const StringPiece& filters,
00451 MessageHandler* handler);
00452
00456 bool EnableFiltersByCommaSeparatedList(const StringPiece& filters,
00457 MessageHandler* handler);
00458
00462 bool DisableFiltersByCommaSeparatedList(const StringPiece& filters,
00463 MessageHandler* handler);
00464
00472 void DisableAllFiltersNotExplicitlyEnabled();
00473
00476 void EnableFilter(Filter filter);
00479 void ForceEnableFilter(Filter filter);
00480 void DisableFilter(Filter filter);
00481 void EnableFilters(const FilterSet& filter_set);
00482 void DisableFilters(const FilterSet& filter_set);
00485 void ClearFilters();
00486
00489 void CheckFiltersAgainst(const FilterSet& enabled_filters,
00490 const FilterSet& disabled_filters);
00491
00493 void EnableExtendCacheFilters();
00494
00495 bool Enabled(Filter filter) const;
00496
00499 OptionSettingResult SetOptionFromName(
00500 const StringPiece& name, const GoogleString& value, GoogleString* msg);
00501
00504 bool SetOptionFromNameAndLog(const StringPiece& name,
00505 const GoogleString& value,
00506 MessageHandler* handler);
00507
00510
00511 int64 css_outline_min_bytes() const { return css_outline_min_bytes_.value(); }
00512 void set_css_outline_min_bytes(int64 x) {
00513 set_option(x, &css_outline_min_bytes_);
00514 }
00515
00516 GoogleString ga_id() const { return ga_id_.value(); }
00517 void set_ga_id(GoogleString id) {
00518 set_option(id, &ga_id_);
00519 }
00520
00521 bool increase_speed_tracking() const {
00522 return increase_speed_tracking_.value();
00523 }
00524 void set_increase_speed_tracking(bool x) {
00525 set_option(x, &increase_speed_tracking_);
00526 }
00527
00528 int64 js_outline_min_bytes() const { return js_outline_min_bytes_.value(); }
00529 void set_js_outline_min_bytes(int64 x) {
00530 set_option(x, &js_outline_min_bytes_);
00531 }
00532
00533 int64 progressive_jpeg_min_bytes() const {
00534 return progressive_jpeg_min_bytes_.value();
00535 }
00536 void set_progressive_jpeg_min_bytes(int64 x) {
00537 set_option(x, &progressive_jpeg_min_bytes_);
00538 }
00539
00541 int64 ImageInlineMaxBytes() const;
00542 void set_image_inline_max_bytes(int64 x);
00544 int64 CssImageInlineMaxBytes() const;
00545 void set_css_image_inline_max_bytes(int64 x) {
00546 set_option(x, &css_image_inline_max_bytes_);
00547 }
00549 int64 MaxImageInlineMaxBytes() const;
00550 int64 css_inline_max_bytes() const { return css_inline_max_bytes_.value(); }
00551 void set_css_inline_max_bytes(int64 x) {
00552 set_option(x, &css_inline_max_bytes_);
00553 }
00554 int64 js_inline_max_bytes() const { return js_inline_max_bytes_.value(); }
00555 void set_js_inline_max_bytes(int64 x) {
00556 set_option(x, &js_inline_max_bytes_);
00557 }
00558 int64 max_html_cache_time_ms() const {
00559 return max_html_cache_time_ms_.value();
00560 }
00561 void set_max_html_cache_time_ms(int64 x) {
00562 set_option(x, &max_html_cache_time_ms_);
00563 }
00564 int64 min_resource_cache_time_to_rewrite_ms() const {
00565 return min_resource_cache_time_to_rewrite_ms_.value();
00566 }
00567 void set_min_resource_cache_time_to_rewrite_ms(int64 x) {
00568 set_option(x, &min_resource_cache_time_to_rewrite_ms_);
00569 }
00570
00573 void set_cache_invalidation_timestamp_mutex(ThreadSystem::RWLock* lock) {
00574 cache_invalidation_timestamp_.set_mutex(lock);
00575 }
00576
00578 int64 cache_invalidation_timestamp() const {
00579 ThreadSystem::ScopedReader lock(cache_invalidation_timestamp_.mutex());
00580 return cache_invalidation_timestamp_.value();
00581 }
00582
00589 void set_cache_invalidation_timestamp(int64 timestamp_ms) {
00590 cache_invalidation_timestamp_.mutex()->DCheckLocked();
00591 set_option(timestamp_ms, &cache_invalidation_timestamp_);
00592 }
00593
00600 bool UpdateCacheInvalidationTimestampMs(int64 timestamp_ms,
00601 const Hasher* hasher);
00602
00605 int64 idle_flush_time_ms() const {
00606 return idle_flush_time_ms_.value();
00607 }
00608 void set_idle_flush_time_ms(int64 x) {
00609 set_option(x, &idle_flush_time_ms_);
00610 }
00611
00614 int max_url_segment_size() const { return max_url_segment_size_.value(); }
00615 void set_max_url_segment_size(int x) {
00616 set_option(x, &max_url_segment_size_);
00617 }
00618
00619 int image_max_rewrites_at_once() const {
00620 return image_max_rewrites_at_once_.value();
00621 }
00622 void set_image_max_rewrites_at_once(int x) {
00623 set_option(x, &image_max_rewrites_at_once_);
00624 }
00625
00627 int max_url_size() const { return max_url_size_.value(); }
00628 void set_max_url_size(int x) {
00629 set_option(x, &max_url_size_);
00630 }
00631
00632 void set_enabled(bool x) {
00633 set_option(x, &enabled_);
00634 }
00635 bool enabled() const { return enabled_.value(); }
00636
00637 void set_ajax_rewriting_enabled(bool x) {
00638 set_option(x, &ajax_rewriting_enabled_);
00639 }
00640
00641 bool ajax_rewriting_enabled() const {
00642 return ajax_rewriting_enabled_.value();
00643 }
00644
00645 void set_botdetect_enabled(bool x) {
00646 set_option(x, &botdetect_enabled_);
00647 }
00648 bool botdetect_enabled() const { return botdetect_enabled_.value(); }
00649
00650 void set_combine_across_paths(bool x) {
00651 set_option(x, &combine_across_paths_);
00652 }
00653 bool combine_across_paths() const { return combine_across_paths_.value(); }
00654
00655 void set_log_rewrite_timing(bool x) {
00656 set_option(x, &log_rewrite_timing_);
00657 }
00658 bool log_rewrite_timing() const { return log_rewrite_timing_.value(); }
00659
00660 void set_lowercase_html_names(bool x) {
00661 set_option(x, &lowercase_html_names_);
00662 }
00663 bool lowercase_html_names() const { return lowercase_html_names_.value(); }
00664
00665 void set_always_rewrite_css(bool x) {
00666 set_option(x, &always_rewrite_css_);
00667 }
00668 bool always_rewrite_css() const { return always_rewrite_css_.value(); }
00669
00670 void set_respect_vary(bool x) {
00671 set_option(x, &respect_vary_);
00672 }
00673 bool respect_vary() const { return respect_vary_.value(); }
00674
00675 void set_flush_html(bool x) { set_option(x, &flush_html_); }
00676 bool flush_html() const { return flush_html_.value(); }
00677
00678 void set_serve_stale_if_fetch_error(bool x) {
00679 set_option(x, &serve_stale_if_fetch_error_);
00680 }
00681 bool serve_stale_if_fetch_error() const {
00682 return serve_stale_if_fetch_error_.value();
00683 }
00684
00685 void set_enable_blink_critical_line(bool x) {
00686 set_option(x, &enable_blink_critical_line_);
00687 }
00688 bool enable_blink_critical_line() const {
00689 return enable_blink_critical_line_.value();
00690 }
00691
00692 void set_serve_blink_non_critical(bool x) {
00693 set_option(x, &serve_blink_non_critical_);
00694 }
00695 bool serve_blink_non_critical() const {
00696 return serve_blink_non_critical_.value();
00697 }
00698
00699 void set_default_cache_html(bool x) { set_option(x, &default_cache_html_); }
00700 bool default_cache_html() const { return default_cache_html_.value(); }
00701
00702 void set_modify_caching_headers(bool x) {
00703 set_option(x, &modify_caching_headers_);
00704 }
00705 bool modify_caching_headers() const {
00706 return modify_caching_headers_.value();
00707 }
00708
00709 void set_lazyload_images_after_onload(bool x) {
00710 set_option(x, &lazyload_images_after_onload_);
00711 }
00712 bool lazyload_images_after_onload() const {
00713 return lazyload_images_after_onload_.value();
00714 }
00715
00716 void set_max_inlined_preview_images_index(int x) {
00717 set_option(x, &max_inlined_preview_images_index_);
00718 }
00719 int max_inlined_preview_images_index() const {
00720 return max_inlined_preview_images_index_.value();
00721 }
00722
00723 void set_min_image_size_low_resolution_bytes(int64 x) {
00724 set_option(x, &min_image_size_low_resolution_bytes_);
00725 }
00726 int64 min_image_size_low_resolution_bytes() const {
00727 return min_image_size_low_resolution_bytes_.value();
00728 }
00729
00730 void set_max_image_size_low_resolution_bytes(int64 x) {
00731 set_option(x, &max_image_size_low_resolution_bytes_);
00732 }
00733 int64 max_image_size_low_resolution_bytes() const {
00734 return max_image_size_low_resolution_bytes_.value();
00735 }
00736
00737 void set_critical_images_cache_expiration_time_ms(int64 x) {
00738 set_option(x, &critical_images_cache_expiration_time_ms_);
00739 }
00740 int64 critical_images_cache_expiration_time_ms() const {
00741 return critical_images_cache_expiration_time_ms_.value();
00742 }
00743
00744 bool image_retain_color_profile() const {
00745 return image_retain_color_profile_.value();
00746 }
00747 void set_image_retain_color_profile(bool x) {
00748 set_option(x, &image_retain_color_profile_);
00749 }
00750
00751 bool image_retain_color_sampling() const {
00752 return image_retain_color_sampling_.value();
00753 }
00754 void set_image_retain_color_sampling(bool x) {
00755 set_option(x, &image_retain_color_sampling_);
00756 }
00757
00758 bool image_retain_exif_data() const {
00759 return image_retain_exif_data_.value();
00760 }
00761 void set_image_retain_exif_data(bool x) {
00762 set_option(x, &image_retain_exif_data_);
00763 }
00764
00765 void set_metadata_cache_staleness_threshold_ms(int64 x) {
00766 set_option(x, &metadata_cache_staleness_threshold_ms_);
00767 }
00768 int64 metadata_cache_staleness_threshold_ms() const {
00769 return metadata_cache_staleness_threshold_ms_.value();
00770 }
00771
00772 const BeaconUrl& beacon_url() const { return beacon_url_.value(); }
00773 void set_beacon_url(const GoogleString& beacon_url) {
00774 beacon_url_.SetFromString(beacon_url);
00775 }
00776
00778 virtual bool trim_urls_in_css() const { return true; }
00779
00780 int image_jpeg_recompress_quality() const {
00781 return image_jpeg_recompress_quality_.value();
00782 }
00783 void set_image_jpeg_recompress_quality(int x) {
00784 set_option(x, &image_jpeg_recompress_quality_);
00785 }
00786
00787 int image_limit_optimized_percent() const {
00788 return image_limit_optimized_percent_.value();
00789 }
00790 void set_image_limit_optimized_percent(int x) {
00791 set_option(x, &image_limit_optimized_percent_);
00792 }
00793 int image_limit_resize_area_percent() const {
00794 return image_limit_resize_area_percent_.value();
00795 }
00796 void set_image_limit_resize_area_percent(int x) {
00797 set_option(x, &image_limit_resize_area_percent_);
00798 }
00799
00800 int image_jpeg_num_progressive_scans() const {
00801 return image_jpeg_num_progressive_scans_.value();
00802 }
00803 void set_image_jpeg_num_progressive_scans(int x) {
00804 set_option(x, &image_jpeg_num_progressive_scans_);
00805 }
00806
00807 int image_webp_recompress_quality() const {
00808 return image_webp_recompress_quality_.value();
00809 }
00810 void set_image_webp_recompress_quality(int x) {
00811 set_option(x, &image_webp_recompress_quality_);
00812 }
00813
00814 bool domain_rewrite_hyperlinks() const {
00815 return domain_rewrite_hyperlinks_.value();
00816 }
00817 void set_domain_rewrite_hyperlinks(bool x) {
00818 set_option(x, &domain_rewrite_hyperlinks_);
00819 }
00820
00821 void set_enable_defer_js_experimental(bool x) {
00822 set_option(x, &enable_defer_js_experimental_);
00823 }
00824 bool enable_defer_js_experimental() const {
00825 return enable_defer_js_experimental_.value();
00826 }
00832 bool MatchesPrioritizeVisibleContentCacheableFamilies(
00833 const StringPiece& str) const {
00834 return prioritize_visible_content_cacheable_families_.Match(str, false);
00835 }
00838 void AddToPrioritizeVisibleContentCacheableFamilies(const StringPiece& str);
00839
00842 const GoogleString&
00843 prioritize_visible_content_non_cacheable_elements() const {
00844 return prioritize_visible_content_non_cacheable_elements_.value();
00845 }
00848 void set_prioritize_visible_content_non_cacheable_elements(
00849 const StringPiece& p) {
00850 set_option(GoogleString(p.data(), p.size()),
00851 &prioritize_visible_content_non_cacheable_elements_);
00852 }
00853
00855 int64 prioritize_visible_content_cache_time_ms() const {
00856 return prioritize_visible_content_cache_time_ms_.value();
00857 }
00858 void set_prioritize_visible_content_cache_time_ms(int64 x) {
00859 set_option(x, &prioritize_visible_content_cache_time_ms_);
00860 }
00861
00863 void set_panel_config(PublisherConfig* panel_config);
00864 const PublisherConfig* panel_config() const;
00865
00866 void set_running_furious_experiment(bool x) {
00867 set_option(x, &running_furious_);
00868 }
00869 bool running_furious() const {
00870 return running_furious_.value();
00871 }
00872
00874 void set_furious_ga_slot(int x) {
00875 set_option(x, &furious_ga_slot_);
00876 }
00877
00878 int furious_ga_slot() const { return furious_ga_slot_.value(); }
00879
00880 void set_report_unload_time(bool x) {
00881 set_option(x, &report_unload_time_);
00882 }
00883 bool report_unload_time() const {
00884 return report_unload_time_.value();
00885 }
00886
00887 void set_implicit_cache_ttl_ms(int64 x) {
00888 set_option(x, &implicit_cache_ttl_ms_);
00889 }
00890 int64 implicit_cache_ttl_ms() const {
00891 return implicit_cache_ttl_ms_.value();
00892 }
00893
00894 void set_x_header_value(const StringPiece& p) {
00895 set_option(GoogleString(p.data(), p.size()), &x_header_value_);
00896 }
00897 const GoogleString& x_header_value() const {
00898 return x_header_value_.value();
00899 }
00900
00901 void set_avoid_renaming_introspective_javascript(bool x) {
00902 set_option(x, &avoid_renaming_introspective_javascript_);
00903 }
00904 bool avoid_renaming_introspective_javascript() const {
00905 return avoid_renaming_introspective_javascript_.value();
00906 }
00907
00908 void set_enable_blink_for_mobile_devices(bool x) {
00909 set_option(x, &enable_blink_for_mobile_devices_);
00910 }
00911 bool enable_blink_for_mobile_devices() const {
00912 return enable_blink_for_mobile_devices_.value();
00913 }
00914
00915 void set_use_fixed_user_agent_for_blink_cache_misses(bool x) {
00916 set_option(x, &use_fixed_user_agent_for_blink_cache_misses_);
00917 }
00918 bool use_fixed_user_agent_for_blink_cache_misses() const {
00919 return use_fixed_user_agent_for_blink_cache_misses_.value();
00920 }
00921
00922 void set_blink_desktop_user_agent(const StringPiece& p) {
00923 set_option(GoogleString(p.data(), p.size()), &blink_desktop_user_agent_);
00924 }
00925 const GoogleString& blink_desktop_user_agent() const {
00926 return blink_desktop_user_agent_.value();
00927 }
00928
00943 virtual void Merge(const RewriteOptions& src);
00944
00947 void Allow(const StringPiece& wildcard_pattern) {
00948 Modify();
00949 allow_resources_.Allow(wildcard_pattern);
00950 }
00951
00954 void Disallow(const StringPiece& wildcard_pattern) {
00955 Modify();
00956 allow_resources_.Disallow(wildcard_pattern);
00957 }
00958
00962 virtual void DisallowTroublesomeResources();
00963
00964 DomainLawyer* domain_lawyer() { return &domain_lawyer_; }
00965 const DomainLawyer* domain_lawyer() const { return &domain_lawyer_; }
00966
00967 FileLoadPolicy* file_load_policy() { return &file_load_policy_; }
00968 const FileLoadPolicy* file_load_policy() const { return &file_load_policy_; }
00969
00972 bool IsAllowed(const StringPiece& url) const {
00973 return allow_resources_.Match(url, true);
00974 }
00975
00977 void RetainComment(const StringPiece& comment) {
00978 Modify();
00979 retain_comments_.Allow(comment);
00980 }
00981
00985 bool IsRetainedComment(const StringPiece& comment) const {
00986 return retain_comments_.Match(comment, false);
00987 }
00988
00992 virtual RewriteOptions* Clone() const;
00993
00999 void ComputeSignature(const Hasher* hasher);
01000
01007 void ClearSignatureWithCaution() {
01008 frozen_ = false;
01009 signature_.clear();
01010 }
01011
01014 void ClearSignatureForTesting() {
01015 ClearSignatureWithCaution();
01016 }
01017
01019 const GoogleString& signature() const {
01020 DCHECK(frozen_);
01028 ThreadSystem::ScopedReader lock(cache_invalidation_timestamp_.mutex());
01029 return signature_;
01030 }
01031
01032 virtual GoogleString ToString() const;
01033
01036 virtual GoogleString ToExperimentString() const;
01037
01041 virtual GoogleString ToExperimentDebugString() const;
01042
01044 virtual const char* class_name() const;
01045
01047 virtual bool NeedLowResImages() const {
01048 return Enabled(kDelayImages);
01049 }
01050
01052 static const char* LookupOptionEnum(RewriteOptions::OptionEnum option_enum) {
01053 return (option_enum < kEndOfOptions) ?
01054 option_enum_to_name_array_[option_enum] : NULL;
01055 }
01056
01057 protected:
01058 class OptionBase {
01059 public:
01060 OptionBase()
01061 : id_(NULL), option_enum_(RewriteOptions::kEndOfOptions),
01062 do_not_use_for_signature_computation_(false) {}
01063 virtual ~OptionBase();
01064 virtual bool SetFromString(const GoogleString& value_string) = 0;
01065 virtual void Merge(const OptionBase* src) = 0;
01066 virtual bool was_set() const = 0;
01067 virtual GoogleString Signature(const Hasher* hasher) const = 0;
01068 virtual GoogleString ToString() const = 0;
01069 void set_id(const char* id) { id_ = id; }
01070 const char* id() {
01071 DCHECK(id_);
01072 return id_;
01073 }
01074 void set_option_enum(OptionEnum option_enum) { option_enum_ = option_enum; }
01075 OptionEnum option_enum() const { return option_enum_; }
01076 void DoNotUseForSignatureComputation() {
01077 do_not_use_for_signature_computation_ = true;
01078 }
01079 bool is_used_for_signature_computation() const {
01080 return !do_not_use_for_signature_computation_;
01081 }
01082
01083 private:
01084 const char* id_;
01085 OptionEnum option_enum_;
01086 bool do_not_use_for_signature_computation_;
01087 };
01088
01098 template<class T> class OptionTemplateBase : public OptionBase {
01099 public:
01100 OptionTemplateBase() : was_set_(false) {}
01101
01102 virtual bool was_set() const { return was_set_; }
01103
01104 void set(const T& val) {
01105 was_set_ = true;
01106 value_ = val;
01107 }
01108
01109 void set_default(const T& val) {
01110 if (!was_set_) {
01111 value_ = val;
01112 }
01113 }
01114
01115 const T& value() const { return value_; }
01116
01122 virtual void Merge(const OptionBase* src) {
01123 DCHECK(option_enum() == src->option_enum());
01124 MergeHelper(static_cast<const OptionTemplateBase*>(src));
01125 }
01126
01127 void MergeHelper(const OptionTemplateBase* src) {
01130 if (src->was_set_ || !was_set_) {
01131 value_ = src->value_;
01132 was_set_ = src->was_set_;
01133 }
01134 }
01135
01136 private:
01137 bool was_set_;
01138 T value_;
01139
01140 DISALLOW_COPY_AND_ASSIGN(OptionTemplateBase);
01141 };
01142
01147 template<class T> class Option : public OptionTemplateBase<T> {
01148 public:
01149 Option() {}
01150
01152 virtual bool SetFromString(const GoogleString& value_string) {
01153 T value;
01154 bool success = RewriteOptions::ParseFromString(value_string, &value);
01155 if (success) {
01156 this->set(value);
01157 }
01158 return success;
01159 }
01160
01161 virtual GoogleString Signature(const Hasher* hasher) const {
01162 return RewriteOptions::OptionSignature(this->value(), hasher);
01163 }
01164
01165 virtual GoogleString ToString() const {
01166 return RewriteOptions::ToString(this->value());
01167 }
01168
01169 private:
01170 DISALLOW_COPY_AND_ASSIGN(Option);
01171 };
01172
01185 class MutexedOptionInt64MergeWithMax : public Option<int64> {
01186 public:
01187 MutexedOptionInt64MergeWithMax();
01188 virtual ~MutexedOptionInt64MergeWithMax();
01189
01194 virtual void Merge(const OptionBase* src_base);
01195
01206 void set(const int64& value) {
01207 mutex_->DCheckReaderLocked();
01208 Option<int64>::set(value);
01209 }
01210
01224 ThreadSystem::RWLock* mutex() const { return mutex_.get(); }
01225
01231 void set_mutex(ThreadSystem::RWLock* lock) { mutex_.reset(lock); }
01232
01233 private:
01234 scoped_ptr<ThreadSystem::RWLock> mutex_;
01235 };
01236
01247 template<class T, class U>
01248 void add_option(U default_value, OptionTemplateBase<T>* option,
01249 const char* id, OptionEnum option_enum) {
01250 add_option(default_value, option, id);
01251 option->set_option_enum(option_enum);
01252 }
01253 template<class T, class U>
01254 void add_option(U default_value, OptionTemplateBase<T>* option,
01255 const char* id) {
01256 option->set_default(default_value);
01257 option->set_id(id);
01258 all_options_.push_back(option);
01259 }
01260
01264 template<class T, class U>
01265 void set_option(const U& new_value, OptionTemplateBase<T>* option) {
01266 option->set(new_value);
01267 Modify();
01268 }
01269
01274 void SortOptions();
01275
01277 void Modify();
01278
01280 typedef std::vector<OptionBase*> OptionBaseVector;
01281
01283 const OptionBaseVector& all_options() const {
01284 return all_options_;
01285 }
01286
01287 private:
01288 typedef std::vector<Filter> FilterVector;
01289
01290 void SetUp();
01291 bool AddCommaSeparatedListToFilterSetState(
01292 const StringPiece& filters, MessageHandler* handler, FilterSet* set);
01293 static bool AddCommaSeparatedListToFilterSet(
01294 const StringPiece& filters, MessageHandler* handler, FilterSet* set);
01295 bool AddCommaSeparatedListToPlusAndMinusFilterSets(
01296 const StringPiece& filters, MessageHandler* handler,
01297 FilterSet* plus_set, FilterSet* minus_set);
01298 static bool AddByNameToFilterSet(
01299 const StringPiece& option, MessageHandler* handler, FilterSet* set);
01300 static Filter LookupFilter(const StringPiece& filter_name);
01301 static OptionEnum LookupOption(const StringPiece& option_name);
01304 static void InitOptionEnumToNameArray();
01305
01308 static bool ParseFromString(const GoogleString& value_string, bool* value) {
01311 if (StringCaseEqual(value_string, "true") ||
01312 StringCaseEqual(value_string, "on")) {
01313 *value = true;
01314 } else if (StringCaseEqual(value_string, "false") ||
01315 StringCaseEqual(value_string, "off")) {
01316 *value = false;
01317 } else {
01320 return false;
01321 }
01322 return true;
01323 }
01324 static bool ParseFromString(const GoogleString& value_string, int* value) {
01325 return StringToInt(value_string, value);
01326 }
01327 static bool ParseFromString(const GoogleString& value_string, int64* value) {
01328 return StringToInt64(value_string, value);
01329 }
01330 static bool ParseFromString(const GoogleString& value_string,
01331 GoogleString* value) {
01332 *value = value_string;
01333 return true;
01334 }
01335 static bool ParseFromString(const GoogleString& value_string,
01336 RewriteLevel* value) {
01337 return ParseRewriteLevel(value_string, value);
01338 }
01339 static bool ParseFromString(const GoogleString& value_string,
01340 BeaconUrl* value) {
01341 return ParseBeaconUrl(value_string, value);
01342 }
01343
01346 static GoogleString OptionSignature(bool x, const Hasher* hasher) {
01347 return x ? "T" : "F";
01348 }
01349 static GoogleString OptionSignature(int x, const Hasher* hasher) {
01350 return IntegerToString(x);
01351 }
01352 static GoogleString OptionSignature(int64 x, const Hasher* hasher) {
01353 return Integer64ToString(x);
01354 }
01355 static GoogleString OptionSignature(const GoogleString& x,
01356 const Hasher* hasher);
01357 static GoogleString OptionSignature(RewriteLevel x,
01358 const Hasher* hasher);
01359 static GoogleString OptionSignature(const BeaconUrl& beacon_url,
01360 const Hasher* hasher);
01361
01364 static GoogleString ToString(bool x) {
01365 return x ? "True" : "False";
01366 }
01367 static GoogleString ToString(int x) {
01368 return IntegerToString(x);
01369 }
01370 static GoogleString ToString(int64 x) {
01371 return Integer64ToString(x);
01372 }
01373 static GoogleString ToString(const GoogleString& x) {
01374 return x;
01375 }
01376 static GoogleString ToString(RewriteLevel x);
01377 static GoogleString ToString(const BeaconUrl& beacon_url);
01378
01381 static bool OptionLessThanByEnum(OptionBase* option1, OptionBase* option2) {
01382 return option1->option_enum() < option2->option_enum();
01383 }
01384
01386 static bool LessThanArg(OptionBase* option, OptionEnum arg) {
01387 return option->option_enum() < arg;
01388 }
01389
01392 void SetupFuriousRewriters();
01393 bool modified_;
01394 bool frozen_;
01395 FilterSet enabled_filters_;
01396 FilterSet disabled_filters_;
01397
01403 Option<RewriteLevel> level_;
01404
01405 MutexedOptionInt64MergeWithMax cache_invalidation_timestamp_;
01406
01407 Option<int64> css_inline_max_bytes_;
01408 Option<int64> image_inline_max_bytes_;
01409 Option<int64> css_image_inline_max_bytes_;
01410 Option<int64> js_inline_max_bytes_;
01411 Option<int64> css_outline_min_bytes_;
01412 Option<int64> js_outline_min_bytes_;
01413 Option<int64> progressive_jpeg_min_bytes_;
01415 Option<int64> max_html_cache_time_ms_;
01417 Option<int64> min_resource_cache_time_to_rewrite_ms_;
01418 Option<int64> idle_flush_time_ms_;
01419
01421 Option<int> image_jpeg_recompress_quality_;
01422 Option<int> image_jpeg_num_progressive_scans_;
01423 Option<bool> image_retain_color_profile_;
01424 Option<bool> image_retain_color_sampling_;
01425 Option<bool> image_retain_exif_data_;
01426
01428 Option<int> image_limit_optimized_percent_;
01429 Option<int> image_limit_resize_area_percent_;
01430
01432 Option<int> image_webp_recompress_quality_;
01433
01434 Option<int> image_max_rewrites_at_once_;
01435 Option<int> max_url_segment_size_;
01436 Option<int> max_url_size_;
01437
01438 Option<bool> enabled_;
01439 Option<bool> ajax_rewriting_enabled_;
01440 Option<bool> botdetect_enabled_;
01441 Option<bool> combine_across_paths_;
01442 Option<bool> log_rewrite_timing_;
01443 Option<bool> lowercase_html_names_;
01444 Option<bool> always_rewrite_css_;
01445 Option<bool> respect_vary_;
01446 Option<bool> flush_html_;
01449 Option<bool> serve_stale_if_fetch_error_;
01451 Option<bool> enable_blink_critical_line_;
01455 Option<bool> serve_blink_non_critical_;
01460 Option<bool> default_cache_html_;
01465 Option<bool> modify_caching_headers_;
01469 Option<bool> lazyload_images_after_onload_;
01472 Option<bool> domain_rewrite_hyperlinks_;
01473
01477 Option<bool> running_furious_;
01478
01479 Option<int> furious_ga_slot_;
01480
01483 Option<bool> increase_speed_tracking_;
01484
01488 Option<bool> report_unload_time_;
01489
01491 Option<bool> enable_defer_js_experimental_;
01492
01495 Option<bool> avoid_renaming_introspective_javascript_;
01496
01499 Option<int> max_inlined_preview_images_index_;
01501 Option<int64> min_image_size_low_resolution_bytes_;
01503 Option<int64> max_image_size_low_resolution_bytes_;
01504
01506 Option<int64> critical_images_cache_expiration_time_ms_;
01507
01510 Option<int64> metadata_cache_staleness_threshold_ms_;
01511
01515 Option<int64> implicit_cache_ttl_ms_;
01516
01520 Option<GoogleString> prioritize_visible_content_non_cacheable_elements_;
01522 Option<int64> prioritize_visible_content_cache_time_ms_;
01530 WildcardGroup prioritize_visible_content_cacheable_families_;
01531
01532 scoped_ptr<PublisherConfig> panel_config_;
01533
01534 Option<BeaconUrl> beacon_url_;
01535 Option<GoogleString> ga_id_;
01536
01538 Option<GoogleString> x_header_value_;
01539
01541 Option<bool> enable_blink_for_mobile_devices_;
01544 Option<bool> use_fixed_user_agent_for_blink_cache_misses_;
01547 Option<GoogleString> blink_desktop_user_agent_;
01548
01552 OptionBaseVector all_options_;
01553
01555 static const char* option_enum_to_name_array_[kEndOfOptions];
01556
01563 bool options_uniqueness_checked_;
01564
01566 int furious_id_;
01567 int furious_percent_;
01568 std::vector<FuriousSpec*> furious_specs_;
01569
01570 DomainLawyer domain_lawyer_;
01571 FileLoadPolicy file_load_policy_;
01572
01573 WildcardGroup allow_resources_;
01574 WildcardGroup retain_comments_;
01575
01576 GoogleString signature_;
01577
01578 DISALLOW_COPY_AND_ASSIGN(RewriteOptions);
01579 };
01580
01581 }
01582
01583 #endif ///< NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_OPTIONS_H_