//
//  WXPageDomain.h
//  PonyDebuggerDerivedSources
//
//  Generated on 8/23/12
//
//  Licensed to Square, Inc. under one or more contributor license agreements.
//  See the LICENSE file distributed with this work for the terms under
//  which Square, Inc. licenses this file to you.
//

#import "WXObject.h"
#import "WXDebugger.h"
#import "WXDynamicDebuggerDomain.h"

@class WXPageFrame;
@class WXPageFrameResourceTree;

@protocol WXPageCommandDelegate;

// Actions and events related to the inspected page belong to the page domain.
@interface WXPageDomain : WXDynamicDebuggerDomain 

@property (nonatomic, assign) id <WXPageCommandDelegate, WXCommandDelegate> delegate;

@property (nonatomic, assign) CGFloat screenScaleFactor;

// Events
- (void)domContentEventFiredWithTimestamp:(NSNumber *)timestamp;
- (void)loadEventFiredWithTimestamp:(NSNumber *)timestamp;

// Fired once navigation of the frame has completed. Frame is now associated with the new loader.
// Param frame: Frame object.
- (void)frameNavigatedWithFrame:(WXPageFrame *)frame;

// Fired when frame has been detached from its parent.
// Param frameId: Id of the frame that has been detached.
- (void)frameDetachedWithFrameId:(NSString *)frameId;

//yangshengtao test
- (void)workerRegistrationUpdated;
- (void)workerVersionUpdated;

@end

@protocol WXPageCommandDelegate <WXCommandDelegate>
@optional

// Enables page domain notifications.
- (void)domain:(WXPageDomain *)domain enableWithCallback:(void (^)(id error))callback;

// Disables page domain notifications.
- (void)domain:(WXPageDomain *)domain disableWithCallback:(void (^)(id error))callback;
// Callback Param identifier: Identifier of the added script.
- (void)domain:(WXPageDomain *)domain addScriptToEvaluateOnLoadWithScriptSource:(NSString *)scriptSource callback:(void (^)(NSString *identifier, id error))callback;
- (void)domain:(WXPageDomain *)domain removeScriptToEvaluateOnLoadWithIdentifier:(NSString *)identifier callback:(void (^)(id error))callback;

// Reloads given page optionally ignoring the cache.
// Param ignoreCache: If true, browser cache is ignored (as if the user pressed Shift+refresh).
// Param scriptToEvaluateOnLoad: If set, the script will be injected into all frames of the inspected page after reload.
- (void)domain:(WXPageDomain *)domain reloadWithIgnoreCache:(NSNumber *)ignoreCache scriptToEvaluateOnLoad:(NSString *)scriptToEvaluateOnLoad callback:(void (^)(id error))callback;

// Navigates current page to the given URL.
// Param url: URL to navigate the page to.
- (void)domain:(WXPageDomain *)domain navigateWithUrl:(NSString *)url callback:(void (^)(id error))callback;

// Returns all browser cookies. Depending on the backend support, will either return detailed cookie information in the <code>cookie</code> field or string cookie representation using <code>cookieString</code>.
// Callback Param cookies: Array of cookie objects.
// Callback Param cookiesString: document.cookie string representation of the cookies.
- (void)domain:(WXPageDomain *)domain getCookiesWithCallback:(void (^)(NSArray *cookies, NSString *cookiesString, id error))callback;

// Deletes browser cookie with given name for the given domain.
// Param cookieName: Name of the cookie to remove.
// Param domain: Domain of the cookie to remove.
- (void)domain:(WXPageDomain *)domain deleteCookieWithCookieName:(NSString *)cookieName domain:(NSString *)domain callback:(void (^)(id error))callback;

// Returns present frame / resource tree structure.
// Callback Param frameTree: Present frame / resource tree structure.
- (void)domain:(WXPageDomain *)domain getResourceTreeWithCallback:(void (^)(WXPageFrameResourceTree *frameTree, id error))callback;

// Returns content of the given resource.
// Param frameId: Frame id to get resource for.
// Param url: URL of the resource to get content for.
// Callback Param content: Resource content.
// Callback Param base64Encoded: True, if content was served as base64.
- (void)domain:(WXPageDomain *)domain getResourceContentWithFrameId:(NSString *)frameId url:(NSString *)url callback:(void (^)(NSString *content, NSNumber *base64Encoded, id error))callback;

// Searches for given string in resource content.
// Param frameId: Frame id for resource to search in.
// Param url: URL of the resource to search in.
// Param query: String to search for.
// Param caseSensitive: If true, search is case sensitive.
// Param isRegex: If true, treats string parameter as regex.
// Callback Param result: List of search matches.
- (void)domain:(WXPageDomain *)domain searchInResourceWithFrameId:(NSString *)frameId url:(NSString *)url query:(NSString *)query caseSensitive:(NSNumber *)caseSensitive isRegex:(NSNumber *)isRegex callback:(void (^)(NSArray *result, id error))callback;

// Searches for given string in frame / resource tree structure.
// Param text: String to search for.
// Param caseSensitive: If true, search is case sensitive.
// Param isRegex: If true, treats string parameter as regex.
// Callback Param result: List of search results.
- (void)domain:(WXPageDomain *)domain searchInResourcesWithText:(NSString *)text caseSensitive:(NSNumber *)caseSensitive isRegex:(NSNumber *)isRegex callback:(void (^)(NSArray *result, id error))callback;

// Sets given markup as the document's HTML.
// Param frameId: Frame id to set HTML for.
// Param html: HTML content to set.
- (void)domain:(WXPageDomain *)domain setDocumentContentWithFrameId:(NSString *)frameId html:(NSString *)html callback:(void (^)(id error))callback;

// Checks whether <code>setDeviceMetricsOverride</code> can be invoked.
// Callback Param result: If true, <code>setDeviceMetricsOverride</code> can safely be invoked on the agent.
- (void)domain:(WXPageDomain *)domain canOverrideDeviceMetricsWithCallback:(void (^)(NSNumber *result, id error))callback;

// Overrides the values of device screen dimensions (window.screen.width, window.screen.height, window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media query results) and the font scale factor.
// Param width: Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
// Param height: Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
// Param fontScaleFactor: Overriding font scale factor value (must be positive). 1 disables the override.
// Param fitWindow: Whether a view that exceeds the available browser window area should be scaled down to fit.
- (void)domain:(WXPageDomain *)domain setDeviceMetricsOverrideWithWidth:(NSNumber *)width height:(NSNumber *)height fontScaleFactor:(NSNumber *)fontScaleFactor fitWindow:(NSNumber *)fitWindow callback:(void (^)(id error))callback;

// Requests that backend shows paint rectangles
// Param result: True for showing paint rectangles
- (void)domain:(WXPageDomain *)domain setShowPaintRectsWithResult:(NSNumber *)result callback:(void (^)(id error))callback;

// Determines if scripts can be executed in the page.
// Callback Param result: Script execution status: "allowed" if scripts can be executed, "disabled" if script execution has been disabled through page settings, "forbidden" if script execution for the given page is not possible for other reasons.
- (void)domain:(WXPageDomain *)domain getScriptExecutionStatusWithCallback:(void (^)(NSString *result, id error))callback;

// Switches script execution in the page.
// Param value: Whether script execution should be disabled in the page.
- (void)domain:(WXPageDomain *)domain setScriptExecutionDisabledWithValue:(NSNumber *)value callback:(void (^)(id error))callback;

// Overrides the Geolocation Position or Error.
// Param latitude: Mock longitude
// Param longitude: Mock latitude
// Param accuracy: Mock accuracy
- (void)domain:(WXPageDomain *)domain setGeolocationOverrideWithLatitude:(NSNumber *)latitude longitude:(NSNumber *)longitude accuracy:(NSNumber *)accuracy callback:(void (^)(id error))callback;

// Clears the overriden Geolocation Position and Error.
- (void)domain:(WXPageDomain *)domain clearGeolocationOverrideWithCallback:(void (^)(id error))callback;

// Checks if Geolocation can be overridden.
// Callback Param result: True if browser can ovrride Geolocation.
- (void)domain:(WXPageDomain *)domain canOverrideGeolocationWithCallback:(void (^)(NSNumber *result, id error))callback;

// Overrides the Device Orientation.
// Param alpha: Mock alpha
// Param beta: Mock beta
// Param gamma: Mock gamma
- (void)domain:(WXPageDomain *)domain setDeviceOrientationOverrideWithAlpha:(NSNumber *)alpha beta:(NSNumber *)beta gamma:(NSNumber *)gamma callback:(void (^)(id error))callback;

// Clears the overridden Device Orientation.
- (void)domain:(WXPageDomain *)domain clearDeviceOrientationOverrideWithCallback:(void (^)(id error))callback;

// Check the backend if Web Inspector can override the device orientation.
// Callback Param result: If true, <code>setDeviceOrientationOverride</code> can safely be invoked on the agent.
- (void)domain:(WXPageDomain *)domain canOverrideDeviceOrientationWithCallback:(void (^)(NSNumber *result, id error))callback;

//start screencast
- (void)domain:(WXPageDomain *)domain startScreencastWithcallback:(void (^)(id error))callback;

//stop screencast
- (void)domain:(WXPageDomain *)domain stopScreencastWithcallback:(void (^)(id error))callback;

// Toggles mouse event-based touch event emulation.
// Param enabled: Whether the touch event emulation should be enabled.
- (void)domain:(WXPageDomain *)domain setTouchEmulationEnabledWithEnabled:(NSNumber *)enabled callback:(void (^)(id error))callback;


@end

@interface WXDebugger (WXPageDomain)

@property (nonatomic, readonly, strong) WXPageDomain *pageDomain;

@end
