Changeset 17408 in webkit
- Timestamp:
- Oct 29, 2006 1:47:23 AM (18 years ago)
- Location:
- trunk
- Files:
-
- 2 deleted
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r17407 r17408 1 t2006-10-29 Darin Adler <darin@apple.com> 2 3 Reviewed by Maciej. 4 5 - eliminate use of NSArray to carry form data around 6 7 * WebCore.exp: 8 * WebCore.xcodeproj/project.pbxproj: 9 * bridge/mac/FormDataMac.h: Removed. 10 * bridge/mac/FormDataMac.mm: Removed. 11 * bridge/mac/FrameMac.h: 12 * bridge/mac/WebCoreFrameBridge.h: 13 * bridge/mac/WebCoreFrameBridge.mm: 14 * html/HTMLFormElement.cpp: 15 (WebCore::HTMLFormElement::submit): 16 * loader/FormData.h: 17 (WebCore::FormData::isEmpty): 18 * loader/mac/FrameLoader.h: 19 * loader/mac/FrameLoader.mm: 20 (WebCore::FrameLoader::load): 21 (WebCore::FrameLoader::post): 22 (WebCore::FrameLoader::loadEmptyDocumentSynchronously): 23 (WebCore::FrameLoader::loadResourceSynchronously): 24 * loader/mac/LoaderFunctionsMac.mm: 25 (WebCore::ServeSynchronousRequest): 26 * loader/mac/WebFormDataStream.h: 27 * loader/mac/WebFormDataStream.m: 28 (WebCore::pairRetain): 29 (WebCore::pairRelease): 30 (WebCore::pairEqual): 31 (WebCore::pairHash): 32 (WebCore::closeCurrentStream): 33 (WebCore::scheduleWithPair): 34 (WebCore::advanceCurrentStream): 35 (WebCore::openNextStream): 36 (WebCore::formCreate): 37 (WebCore::formFinalize): 38 (WebCore::formOpen): 39 (WebCore::formRead): 40 (WebCore::formCanRead): 41 (WebCore::formClose): 42 (WebCore::formSchedule): 43 (WebCore::formUnschedule): 44 (WebCore::formEventCallback): 45 (WebCore::setHTTPBody): 46 * loader/mac/WebSubresourceLoader.h: 47 * loader/mac/WebSubresourceLoader.mm: 48 (WebCore::SubresourceLoader::create): 49 * platform/network/mac/ResourceLoaderMac.mm: 50 1 51 2006-10-29 Maciej Stachowiak <mjs@apple.com> 2 52 -
trunk/WebCore/WebCore.exp
r17405 r17408 302 302 _urlWithData 303 303 _urlWithDataRelativeToURL 304 _webSetHTTPBody305 304 _wkCGContextGetShouldSmoothFonts 306 305 _wkClearGlyphVector -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r17406 r17408 1561 1561 93F199ED08245E59001E9ABC /* XSLTProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC06F24C06D18A7E004A6FA3 /* XSLTProcessor.h */; }; 1562 1562 93F199EE08245E59001E9ABC /* FormData.h in Headers */ = {isa = PBXBuildFile; fileRef = 93ABCE5E06E1A42E0085925B /* FormData.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1563 93F199EF08245E59001E9ABC /* FormDataMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B641F206E28C5C0055F610 /* FormDataMac.h */; };1564 1563 93F199F008245E59001E9ABC /* WebCoreView.h in Headers */ = {isa = PBXBuildFile; fileRef = BE855F7F0701E83500239769 /* WebCoreView.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1565 1564 93F199F108245E59001E9ABC /* WebDashboardRegion.h in Headers */ = {isa = PBXBuildFile; fileRef = 5150C2A10702629000AF642C /* WebDashboardRegion.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1603 1602 93F19B0408245E59001E9ABC /* XSLTProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC06F24B06D18A7E004A6FA3 /* XSLTProcessor.cpp */; }; 1604 1603 93F19B0508245E59001E9ABC /* FormData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93ABCE5D06E1A42E0085925B /* FormData.cpp */; }; 1605 93F19B0608245E59001E9ABC /* FormDataMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 93B641F106E28C5C0055F610 /* FormDataMac.mm */; };1606 1604 93F19B0708245E59001E9ABC /* WebCoreView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE8560510701F91100239769 /* WebCoreView.m */; }; 1607 1605 93F19B0808245E59001E9ABC /* WebDashboardRegion.m in Sources */ = {isa = PBXBuildFile; fileRef = 5150C2A50702629800AF642C /* WebDashboardRegion.m */; }; … … 3245 3243 656D371F0ADBA5DE00A4554D /* WebDocumentLoader.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 30; path = WebDocumentLoader.mm; sourceTree = "<group>"; }; 3246 3244 656D37200ADBA5DE00A4554D /* WebFormDataStream.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebFormDataStream.h; sourceTree = "<group>"; }; 3247 656D37210ADBA5DE00A4554D /* WebFormDataStream.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = WebFormDataStream.m; sourceTree = "<group>"; };3245 656D37210ADBA5DE00A4554D /* WebFormDataStream.m */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 30; path = WebFormDataStream.m; sourceTree = "<group>"; }; 3248 3246 656D37220ADBA5DE00A4554D /* WebFormState.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebFormState.h; sourceTree = "<group>"; }; 3249 3247 656D37230ADBA5DE00A4554D /* WebFormState.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 30; path = WebFormState.mm; sourceTree = "<group>"; }; … … 4337 4335 93B0FD880A759BED0080AD44 /* StringImplMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = StringImplMac.mm; sourceTree = "<group>"; }; 4338 4336 93B0FD890A759BED0080AD44 /* StringMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = StringMac.mm; sourceTree = "<group>"; }; 4339 93B641F106E28C5C0055F610 /* FormDataMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FormDataMac.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };4340 93B641F206E28C5C0055F610 /* FormDataMac.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = FormDataMac.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };4341 4337 93B70D4109EB0C7C009D8468 /* JSXMLHttpRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSXMLHttpRequest.cpp; sourceTree = "<group>"; }; 4342 4338 93B70D4209EB0C7C009D8468 /* JSXMLHttpRequest.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSXMLHttpRequest.h; sourceTree = "<group>"; }; … … 6485 6481 BCEA4945097F0F770094C9E4 /* BrowserExtensionMac.h */, 6486 6482 BCEA4946097F0F770094C9E4 /* BrowserExtensionMac.mm */, 6487 93B641F206E28C5C0055F610 /* FormDataMac.h */,6488 93B641F106E28C5C0055F610 /* FormDataMac.mm */,6489 6483 65BF023B0974819000C43196 /* FrameMac.h */, 6490 6484 65BF023C0974819000C43196 /* FrameMac.mm */, … … 9105 9099 93F199ED08245E59001E9ABC /* XSLTProcessor.h in Headers */, 9106 9100 93F199EE08245E59001E9ABC /* FormData.h in Headers */, 9107 93F199EF08245E59001E9ABC /* FormDataMac.h in Headers */,9108 9101 93F199F008245E59001E9ABC /* WebCoreView.h in Headers */, 9109 9102 93F199F108245E59001E9ABC /* WebDashboardRegion.h in Headers */, … … 10637 10630 93F19B0408245E59001E9ABC /* XSLTProcessor.cpp in Sources */, 10638 10631 93F19B0508245E59001E9ABC /* FormData.cpp in Sources */, 10639 93F19B0608245E59001E9ABC /* FormDataMac.mm in Sources */,10640 10632 93F19B0708245E59001E9ABC /* WebCoreView.m in Sources */, 10641 10633 93F19B0808245E59001E9ABC /* WebDashboardRegion.m in Sources */, -
trunk/WebCore/bridge/mac/FrameMac.h
r17405 r17408 122 122 const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType); 123 123 124 v oid clear(bool clearWindowProperties = true);124 virtual void clear(bool clearWindowProperties = true); 125 125 126 126 void setBridge(WebCoreFrameBridge* p); 127 127 WebCoreFrameBridge* bridge() const { return _bridge; } 128 128 129 virtual void setView(FrameView*); 129 130 virtual void frameDetached(); … … 226 227 bool passWheelEventToWidget(Widget*); 227 228 228 NSString* searchForLabelsAboveCell(RegularExpression* regExp, HTMLTableCellElement* cell);229 NSString* searchForLabelsAboveCell(RegularExpression*, HTMLTableCellElement*); 229 230 NSString* searchForLabelsBeforeElement(NSArray* labels, Element* element); 230 231 NSString* matchLabelsAgainstElement(NSArray* labels, Element* element); -
trunk/WebCore/bridge/mac/WebCoreFrameBridge.h
r17406 r17408 395 395 - (void)frameDetached; 396 396 - (void)receivedData:(NSData *)data textEncodingName:(NSString *)textEncodingName; 397 - (NSData *)syncLoadResourceWithMethod:(NSString *)method URL:(NSURL *)URL customHeaders:(NSDictionary *)requestHeaders postData:(NSArray *)postData finalURL:(NSURL **)finalNSURL responseHeaders:(NSDictionary **)responseHeaderDict statusCode:(int *)statusCode;398 397 399 398 @end -
trunk/WebCore/bridge/mac/WebCoreFrameBridge.mm
r17405 r17408 2070 2070 } 2071 2071 2072 - (NSData *)syncLoadResourceWithMethod:(NSString *)method URL:(NSURL *)URL customHeaders:(NSDictionary *)requestHeaders postData:(NSArray *)postData finalURL:(NSURL **)finalURL responseHeaders:(NSDictionary **)responseHeaderDict statusCode:(int *)statusCode2073 {2074 // Since this is a subresource, we can load any URL (we ignore the return value).2075 // But we still want to know whether we should hide the referrer or not, so we call the canLoadURL method.2076 String referrer = m_frame->referrer();2077 bool hideReferrer;2078 m_frame->loader()->canLoad(URL, referrer, hideReferrer);2079 if (hideReferrer)2080 referrer = String();2081 2082 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];2083 [request setTimeoutInterval:10];2084 2085 // setHTTPMethod is not called for GET requests to work around <rdar://4464032>.2086 if (![method isEqualToString:@"GET"])2087 [request setHTTPMethod:method];2088 2089 if (postData)2090 webSetHTTPBody(request, postData);2091 2092 NSEnumerator *e = [requestHeaders keyEnumerator];2093 NSString *key;2094 while ((key = (NSString *)[e nextObject]) != nil) {2095 [request addValue:[requestHeaders objectForKey:key] forHTTPHeaderField:key];2096 }2097 2098 if (isConditionalRequest(request))2099 [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];2100 else2101 [request setCachePolicy:[m_frame->loader()->documentLoader()->request() cachePolicy]];2102 2103 if (!referrer.isNull())2104 setHTTPReferrer(request, referrer);2105 2106 [request setMainDocumentURL:[m_frame->page()->mainFrame()->loader()->documentLoader()->request() URL]];2107 [request setValue:m_frame->loader()->client()->userAgent([request URL]) forHTTPHeaderField:@"User-Agent"];2108 2109 NSError *error = nil;2110 id identifier = nil;2111 NSURLRequest *newRequest = m_frame->loader()->requestFromDelegate(request, identifier, error);2112 2113 NSURLResponse *response = nil;2114 NSData *result = nil;2115 if (error == nil) {2116 ASSERT(newRequest != nil);2117 result = [NSURLConnection sendSynchronousRequest:newRequest returningResponse:&response error:&error];2118 }2119 2120 if (error == nil) {2121 *finalURL = [response URL];2122 if ([response isKindOfClass:[NSHTTPURLResponse class]]) {2123 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;2124 *responseHeaderDict = [httpResponse allHeaderFields];2125 *statusCode = [httpResponse statusCode];2126 } else {2127 *responseHeaderDict = [NSDictionary dictionary];2128 *statusCode = 200;2129 }2130 } else {2131 *finalURL = URL;2132 *responseHeaderDict = [NSDictionary dictionary];2133 if ([error domain] == NSURLErrorDomain)2134 *statusCode = [error code];2135 else2136 *statusCode = 404;2137 }2138 2139 m_frame->loader()->sendRemainingDelegateMessages(identifier, response, [result length], error);2140 [request release];2141 2142 return result;2143 }2144 2145 2072 // ------------------- 2146 2073 -
trunk/WebCore/html/HTMLFormElement.cpp
r17346 r17408 326 326 } 327 327 328 void HTMLFormElement::submit( bool activateSubmitButton)328 void HTMLFormElement::submit(bool activateSubmitButton) 329 329 { 330 330 FrameView *view = document()->view(); … … 346 346 for (unsigned i = 0; i < formElements.size(); ++i) { 347 347 HTMLGenericFormElement* current = formElements[i]; 348 // Our app needs to get form values for password fields for doing password autocomplete,349 // so we are more lenient in pushing values, and let the app decide what to save when.350 348 if (current->hasLocalName(inputTag)) { 351 HTMLInputElement *input = static_cast<HTMLInputElement*>(current);349 HTMLInputElement* input = static_cast<HTMLInputElement*>(current); 352 350 if (input->isTextField()) { 353 frame->recordFormValue(input->name() .deprecatedString(), input->value().deprecatedString(), this);351 frame->recordFormValue(input->name(), input->value(), this); 354 352 if (input->renderer() && input->inputType() == HTMLInputElement::SEARCH) 355 353 static_cast<RenderLineEdit*>(input->renderer())->addSearchResult(); 356 354 } 357 355 } 358 359 356 if (needButtonActivation) { 360 357 if (current->isActivatedSubmit()) -
trunk/WebCore/loader/FormData.h
r17263 r17408 50 50 String flattenToString() const; // omits files 51 51 52 bool isEmpty() const { return m_elements.isEmpty(); } 52 53 const Vector<FormDataElement>& elements() const { return m_elements; } 53 54 -
trunk/WebCore/loader/mac/FrameLoader.h
r17406 r17408 42 42 #ifdef __OBJC__ 43 43 44 @class WebCoreFrameBridge;45 44 @class WebCorePageState; 46 45 47 @class NS Array;46 @class NSData; 48 47 @class NSDate; 48 @class NSDictionary; 49 @class NSError; 50 @class NSEvent; 51 @class NSMutableURLRequest; 49 52 @class NSURL; 53 @class NSURLAuthenticationChallenge; 50 54 @class NSURLConnection; 51 55 @class NSURLRequest; 52 56 @class NSURLResponse; 53 @class NSDictionary;54 @class NSEvent;55 @class NSError;56 @class NSData;57 @class NSMutableURLRequest;58 @class NSURLAuthenticationChallenge;59 57 60 58 @protocol WebCoreResourceLoader; … … 63 61 #else 64 62 65 class WebCoreFrameBridge;66 63 class WebCorePageState; 67 64 68 class NS Array;65 class NSData; 69 66 class NSDate; 67 class NSDictionary; 68 class NSError; 69 class NSEvent; 70 class NSMutableURLRequest; 70 71 class NSURL; 72 class NSURLAuthenticationChallenge; 71 73 class NSURLConnection; 72 74 class NSURLRequest; 73 75 class NSURLResponse; 74 class NSDictionary;75 class NSEvent;76 class NSError;77 class NSData;78 class NSMutableURLRequest;79 class NSURLAuthenticationChallenge;80 76 81 77 #endif // __OBJC__ … … 87 83 class DocumentLoader; 88 84 class Element; 85 class FormData; 89 86 class FormState; 90 87 class Frame; 91 88 class FrameLoadRequest; 92 89 class FrameLoaderClient; 90 class KURL; 93 91 class MainResourceLoader; 92 class ResourceRequest; 94 93 class String; 95 94 class SubresourceLoader; … … 148 147 void load(const FrameLoadRequest&, bool userGesture, NSEvent* triggeringEvent, 149 148 Element* submitForm, const HashMap<String, String>& formValues); 150 void load(NSURL *, const String& referrer, FrameLoadType, const String& target, NSEvent *event, 151 Element* form, const HashMap<String, String>& formValues); 152 void post(NSURL *, const String& referrer, const String& target, NSArray *postData, const String& contentType, NSEvent *, 153 Element* form, const HashMap<String, String>&); 149 void load(NSURL *, const String& referrer, FrameLoadType, const String& target, 150 NSEvent *event, Element* form, const HashMap<String, String>& formValues); 151 void post(NSURL *, const String& referrer, const String& target, 152 const FormData&, const String& contentType, 153 NSEvent *, Element* form, const HashMap<String, String>&); 154 154 void load(NSURLRequest *); 155 155 void load(NSURLRequest *, const String& frameName); … … 159 159 160 160 bool canLoad(NSURL *, const String& referrer, bool& hideReferrer); 161 162 void loadResourceSynchronously(const ResourceRequest&, 163 KURL& finalURL, NSDictionary *& responseHeaders, int& statusCode, Vector<char>& data); 161 164 162 165 // Also not cool. -
trunk/WebCore/loader/mac/FrameLoader.mm
r17406 r17408 34 34 #import "DOMElementInternal.h" 35 35 #import "Element.h" 36 #import "FormDataMac.h"37 36 #import "FrameLoadRequest.h" 38 37 #import "FrameMac.h" … … 198 197 } else 199 198 post(request.m_request.url().getNSURL(), referrer, (request.m_frameName.length() ? (NSString *)request.m_frameName : nil), 200 arrayFromFormData(request.m_request.httpBody()), request.m_request.httpContentType(), triggeringEvent, submitForm, formValues);199 request.m_request.httpBody(), request.m_request.httpContentType(), triggeringEvent, submitForm, formValues); 201 200 202 201 if (targetFrame && targetFrame != m_frame) … … 1760 1759 } 1761 1760 1762 void FrameLoader::post(NSURL *URL, const String& referrer, const String& frameName, NSArray *postData,1761 void FrameLoader::post(NSURL *URL, const String& referrer, const String& frameName, const FormData& formData, 1763 1762 const String& contentType, NSEvent *event, Element* form, const HashMap<String, String>& formValues) 1764 1763 { … … 1774 1773 setHTTPReferrer(request, referrer); 1775 1774 [request setHTTPMethod:@"POST"]; 1776 webSetHTTPBody(request, postData);1775 setHTTPBody(request, formData); 1777 1776 [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; 1778 1777 … … 1915 1914 NSURL *url = [[NSURL alloc] initWithString:@""]; 1916 1915 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 1917 m_frame->loader()->load(request);1916 load(request); 1918 1917 [request release]; 1919 1918 [url release]; 1919 } 1920 1921 void FrameLoader::loadResourceSynchronously(const ResourceRequest& request, 1922 KURL& finalURL, NSDictionary *& responseHeaders, int& statusCode, Vector<char>& data) 1923 { 1924 #if 0 1925 NSDictionary *headerDict = nil; 1926 const HTTPHeaderMap& requestHeaders = request.httpHeaderFields(); 1927 1928 if (!requestHeaders.isEmpty()) 1929 headerDict = [NSDictionary _webcore_dictionaryWithHeaderMap:requestHeaders]; 1930 1931 FormData postData; 1932 if (!request.httpBody().elements().isEmpty()) 1933 postData = request.httpBody(); 1934 Vector<char> results([resultData length]); 1935 1936 memcpy(results.data(), [resultData bytes], [resultData length]); 1937 #endif 1938 1939 NSURL *URL = request.url().getNSURL(); 1940 1941 // Since this is a subresource, we can load any URL (we ignore the return value). 1942 // But we still want to know whether we should hide the referrer or not, so we call the canLoadURL method. 1943 String referrer = m_frame->referrer(); 1944 bool hideReferrer; 1945 canLoad(URL, referrer, hideReferrer); 1946 if (hideReferrer) 1947 referrer = String(); 1948 1949 NSMutableURLRequest *initialRequest = [[NSMutableURLRequest alloc] initWithURL:URL]; 1950 [initialRequest setTimeoutInterval:10]; 1951 1952 [initialRequest setHTTPMethod:request.httpMethod()]; 1953 1954 if (!request.httpBody().isEmpty()) 1955 setHTTPBody(initialRequest, request.httpBody()); 1956 1957 HTTPHeaderMap::const_iterator end = request.httpHeaderFields().end(); 1958 for (HTTPHeaderMap::const_iterator it = request.httpHeaderFields().begin(); it != end; ++it) 1959 [initialRequest addValue:it->second forHTTPHeaderField:it->first]; 1960 1961 if (isConditionalRequest(initialRequest)) 1962 [initialRequest setCachePolicy:NSURLRequestReloadIgnoringCacheData]; 1963 else 1964 [initialRequest setCachePolicy:[documentLoader()->request() cachePolicy]]; 1965 1966 if (!referrer.isNull()) 1967 setHTTPReferrer(initialRequest, referrer); 1968 1969 [initialRequest setMainDocumentURL:[m_frame->page()->mainFrame()->loader()->documentLoader()->request() URL]]; 1970 [initialRequest setValue:client()->userAgent(URL) forHTTPHeaderField:@"User-Agent"]; 1971 1972 NSError *error = nil; 1973 id identifier = nil; 1974 NSURLRequest *newRequest = requestFromDelegate(initialRequest, identifier, error); 1975 1976 NSURLResponse *response = nil; 1977 NSData *result = nil; 1978 if (error == nil) { 1979 ASSERT(newRequest != nil); 1980 result = [NSURLConnection sendSynchronousRequest:newRequest returningResponse:&response error:&error]; 1981 } 1982 1983 [initialRequest release]; 1984 1985 if (error == nil) { 1986 finalURL = [response URL]; 1987 if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 1988 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 1989 responseHeaders = [httpResponse allHeaderFields]; 1990 statusCode = [httpResponse statusCode]; 1991 } else { 1992 responseHeaders = [NSDictionary dictionary]; 1993 statusCode = 200; 1994 } 1995 } else { 1996 finalURL = URL; 1997 responseHeaders = [NSDictionary dictionary]; 1998 if ([error domain] == NSURLErrorDomain) 1999 statusCode = [error code]; 2000 else 2001 statusCode = 404; 2002 } 2003 2004 sendRemainingDelegateMessages(identifier, response, [result length], error); 2005 2006 data.resize([result length]); 2007 memcpy(data.data(), [result bytes], [result length]); 1920 2008 } 1921 2009 -
trunk/WebCore/loader/mac/LoaderFunctionsMac.mm
r17406 r17408 35 35 #import "FrameMac.h" 36 36 #import "FormData.h" 37 #import "FormDataMac.h"38 37 #import "FrameLoader.h" 39 38 #import "Logging.h" … … 96 95 return Vector<char>(); 97 96 98 WebCoreFrameBridge *bridge = frame->bridge();99 100 97 frame->didTellBridgeAboutLoad(request.url().url()); 101 98 102 99 BEGIN_BLOCK_OBJC_EXCEPTIONS; 103 100 104 NSDictionary *headerDict = nil;105 const HTTPHeaderMap& requestHeaders = request.httpHeaderFields();106 107 if (!requestHeaders.isEmpty())108 headerDict = [NSDictionary _webcore_dictionaryWithHeaderMap:requestHeaders];109 110 NSArray *postData = nil;111 if (!request.httpBody().elements().isEmpty())112 postData = arrayFromFormData(request.httpBody());113 114 NSURL *finalNSURL = nil;115 101 NSDictionary *responseHeaderDict = nil; 116 102 int statusCode = 0; 117 NSData *resultData = [bridge syncLoadResourceWithMethod:request.httpMethod() URL:request.url().getNSURL() customHeaders:headerDict postData:postData finalURL:&finalNSURL responseHeaders:&responseHeaderDict statusCode:&statusCode];118 119 finalURL = finalNSURL;103 Vector<char> result; 104 frame->loader()->loadResourceSynchronously(request, finalURL, responseHeaderDict, statusCode, result); 105 120 106 responseHeaders = DeprecatedString::fromNSString(HeaderStringFromDictionary(responseHeaderDict, statusCode)); 121 107 122 Vector<char> results([resultData length]); 123 124 memcpy(results.data(), [resultData bytes], [resultData length]); 125 126 return results; 108 return result; 127 109 128 110 END_BLOCK_OBJC_EXCEPTIONS; -
trunk/WebCore/loader/mac/WebFormDataStream.h
r16999 r17408 1 1 /* 2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved.2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 27 27 */ 28 28 29 @class NSArray;30 29 @class NSMutableURLRequest; 31 30 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 void webSetHTTPBody(NSMutableURLRequest *request, NSArray *formData); 37 38 #ifdef __cplusplus 31 namespace WebCore { 32 class FormData; 33 void setHTTPBody(NSMutableURLRequest *, const FormData&); 39 34 } 40 #endif -
trunk/WebCore/loader/mac/WebFormDataStream.m
r17259 r17408 1 1 /* 2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved.2 * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 32 32 #import "WebFormDataStream.h" 33 33 34 #import "CString.h" 35 #import "FormData.h" 36 #import "WebCoreSystemInterface.h" 37 #import <sys/stat.h> 34 38 #import <sys/types.h> 35 #import <sys/stat.h>36 37 39 #import <wtf/Assertions.h> 38 #import "WebCoreSystemInterface.h" 39 40 static void formEventCallback(CFReadStreamRef stream, CFStreamEventType type, void *context); 41 42 typedef struct { 40 41 namespace WebCore { 42 43 static void formEventCallback(CFReadStreamRef stream, CFStreamEventType type, void* context); 44 45 struct FormStreamFields { 43 46 CFMutableSetRef scheduledRunLoopPairs; 44 CFMutableArrayRef formDataArray;47 Vector<FormDataElement> remainingElements; // in reverse order 45 48 CFReadStreamRef currentStream; 46 CFDataRefcurrentData;49 char* currentData; 47 50 CFReadStreamRef formStream; 48 } FormStreamFields;49 50 typedef struct{51 }; 52 53 struct SchedulePair { 51 54 CFRunLoopRef runLoop; 52 55 CFStringRef mode; 53 } SchedulePair;54 55 static const void *pairRetain(CFAllocatorRef alloc, const void *value)56 { 57 const SchedulePair *pair = (const SchedulePair *)value;58 59 SchedulePair *result = CFAllocatorAllocate(alloc, sizeof(SchedulePair), 0);56 }; 57 58 static const void* pairRetain(CFAllocatorRef alloc, const void* value) 59 { 60 const SchedulePair* pair = static_cast<const SchedulePair*>(value); 61 62 SchedulePair* result = new SchedulePair; 60 63 CFRetain(pair->runLoop); 61 64 result->runLoop = pair->runLoop; … … 64 67 } 65 68 66 static void pairRelease(CFAllocatorRef alloc, const void *value)67 { 68 const SchedulePair *pair = (const SchedulePair *)value;69 static void pairRelease(CFAllocatorRef alloc, const void* value) 70 { 71 const SchedulePair* pair = static_cast<const SchedulePair*>(value); 69 72 70 73 CFRelease(pair->runLoop); 71 74 CFRelease(pair->mode); 72 CFAllocatorDeallocate(alloc, (void *)pair);73 } 74 75 static Boolean pairEqual(const void *a, const void *b)76 { 77 const SchedulePair *pairA = (const SchedulePair *)a;78 const SchedulePair *pairB = (const SchedulePair *)b;75 delete pair; 76 } 77 78 static Boolean pairEqual(const void* a, const void* b) 79 { 80 const SchedulePair* pairA = static_cast<const SchedulePair*>(a); 81 const SchedulePair* pairB = static_cast<const SchedulePair*>(b); 79 82 80 83 return pairA->runLoop == pairB->runLoop && CFEqual(pairA->mode, pairB->mode); 81 84 } 82 85 83 static CFHashCode pairHash(const void *value)84 { 85 const SchedulePair *pair = (const SchedulePair *)value;86 87 return ( (CFHashCode)pair->runLoop)^ CFHash(pair->mode);86 static CFHashCode pairHash(const void* value) 87 { 88 const SchedulePair* pair = static_cast<const SchedulePair*>(value); 89 90 return (CFHashCode)pair->runLoop ^ CFHash(pair->mode); 88 91 } 89 92 … … 97 100 } 98 101 if (form->currentData) { 99 CFRelease(form->currentData);100 form->currentData = NULL;101 } 102 } 103 104 static void scheduleWithPair(const void *value, void *context)105 { 106 const SchedulePair *pair = (const SchedulePair *)value;102 fastFree(form->currentData); 103 form->currentData = 0; 104 } 105 } 106 107 static void scheduleWithPair(const void* value, void* context) 108 { 109 const SchedulePair* pair = static_cast<const SchedulePair*>(value); 107 110 CFReadStreamRef stream = (CFReadStreamRef)context; 108 111 … … 114 117 closeCurrentStream(form); 115 118 116 // Handle the case where we're at the end of the array. 117 if (CFArrayGetCount(form->formDataArray) == 0) { 119 if (form->remainingElements.isEmpty()) 118 120 return; 119 }120 121 121 122 // Create the new stream. 122 CFAllocatorRef alloc = CFGetAllocator(form->formDataArray); 123 CFTypeRef nextInput = CFArrayGetValueAtIndex(form->formDataArray, 0); 124 if (CFGetTypeID(nextInput) == CFDataGetTypeID()) { 125 // nextInput is a CFData containing an absolute path 126 CFDataRef data = (CFDataRef)nextInput; 127 form->currentStream = CFReadStreamCreateWithBytesNoCopy(alloc, CFDataGetBytePtr(data), CFDataGetLength(data), kCFAllocatorNull); 123 FormDataElement& nextInput = form->remainingElements.last(); 124 if (nextInput.m_type == FormDataElement::data) { 125 size_t size = nextInput.m_data.size(); 126 char* data = nextInput.m_data.releaseBuffer(); 127 form->currentStream = CFReadStreamCreateWithBytesNoCopy(0, reinterpret_cast<const UInt8*>(data), size, kCFAllocatorNull); 128 128 form->currentData = data; 129 CFRetain(data);130 129 } else { 131 // nextInput is a CFString containing an absolute path132 CF StringRef path = (CFStringRef)nextInput;133 CF URLRef fileURL = CFURLCreateWithFileSystemPath(alloc, path, kCFURLPOSIXPathStyle, FALSE);134 form->currentStream = CFReadStreamCreateWithFile( alloc, fileURL);130 CFStringRef filename = nextInput.m_filename.createCFString(); 131 CFURLRef fileURL = CFURLCreateWithFileSystemPath(0, filename, kCFURLPOSIXPathStyle, FALSE); 132 CFRelease(filename); 133 form->currentStream = CFReadStreamCreateWithFile(0, fileURL); 135 134 CFRelease(fileURL); 136 135 } 137 CFArrayRemoveValueAtIndex(form->formDataArray, 0);136 form->remainingElements.removeLast(); 138 137 139 138 // Set up the callback. … … 146 145 } 147 146 148 static void openNextStream(FormStreamFields *form)147 static void openNextStream(FormStreamFields* form) 149 148 { 150 149 // Skip over any streams we can't open. … … 152 151 // can't really do anything useful with an error at this point, so this is better. 153 152 advanceCurrentStream(form); 154 while (form->currentStream && !CFReadStreamOpen(form->currentStream)) {153 while (form->currentStream && !CFReadStreamOpen(form->currentStream)) 155 154 advanceCurrentStream(form); 156 } 157 } 158 159 static void *formCreate(CFReadStreamRef stream, void *context) 160 { 161 CFArrayRef formDataArray = (CFArrayRef)context; 155 } 156 157 static void* formCreate(CFReadStreamRef stream, void* context) 158 { 159 const FormData* formData = static_cast<const FormData*>(context); 162 160 163 161 CFSetCallBacks runLoopAndModeCallBacks = { 0, pairRetain, pairRelease, NULL, pairEqual, pairHash }; 164 162 165 CFAllocatorRef alloc = CFGetAllocator(stream); 166 FormStreamFields *newInfo = CFAllocatorAllocate(alloc, sizeof(FormStreamFields), 0); 167 newInfo->scheduledRunLoopPairs = CFSetCreateMutable(alloc, 0, &runLoopAndModeCallBacks); 168 newInfo->formDataArray = CFArrayCreateMutableCopy(alloc, CFArrayGetCount(formDataArray), formDataArray); 163 FormStreamFields* newInfo = new FormStreamFields; 164 newInfo->scheduledRunLoopPairs = CFSetCreateMutable(0, 0, &runLoopAndModeCallBacks); 169 165 newInfo->currentStream = NULL; 170 newInfo->currentData = NULL;166 newInfo->currentData = 0; 171 167 newInfo->formStream = stream; // Don't retain. That would create a reference cycle. 168 169 // Append in reverse order since we remove elements from the end. 170 size_t size = formData->elements().size(); 171 newInfo->remainingElements.reserveCapacity(size); 172 for (size_t i = 0; i < size; ++i) 173 newInfo->remainingElements.append(formData->elements()[size - i - 1]); 174 172 175 return newInfo; 173 176 } 174 177 175 static void formFinalize(CFReadStreamRef stream, void *context)176 { 177 FormStreamFields *form = (FormStreamFields *)context;178 179 closeCurrentStream( context);178 static void formFinalize(CFReadStreamRef stream, void* context) 179 { 180 FormStreamFields* form = static_cast<FormStreamFields*>(context); 181 182 closeCurrentStream(form); 180 183 CFRelease(form->scheduledRunLoopPairs); 181 CFRelease(form->formDataArray); 182 CFAllocatorDeallocate(CFGetAllocator(stream), context); 183 } 184 185 static Boolean formOpen(CFReadStreamRef stream, CFStreamError *error, Boolean *openComplete, void *context) 186 { 187 FormStreamFields *form = (FormStreamFields *)context; 184 delete form; 185 } 186 187 static Boolean formOpen(CFReadStreamRef stream, CFStreamError* error, Boolean* openComplete, void* context) 188 { 189 FormStreamFields* form = static_cast<FormStreamFields*>(context); 188 190 189 191 openNextStream(form); … … 194 196 } 195 197 196 static CFIndex formRead(CFReadStreamRef stream, UInt8 *buffer, CFIndex bufferLength, CFStreamError *error, Boolean *atEOF, void *context)197 { 198 FormStreamFields *form = (FormStreamFields *)context;198 static CFIndex formRead(CFReadStreamRef stream, UInt8* buffer, CFIndex bufferLength, CFStreamError* error, Boolean* atEOF, void* context) 199 { 200 FormStreamFields* form = static_cast<FormStreamFields*>(context); 199 201 200 202 while (form->currentStream) { … … 217 219 } 218 220 219 static Boolean formCanRead(CFReadStreamRef stream, void *context)220 { 221 FormStreamFields *form = (FormStreamFields *)context;221 static Boolean formCanRead(CFReadStreamRef stream, void* context) 222 { 223 FormStreamFields* form = static_cast<FormStreamFields*>(context); 222 224 223 225 while (form->currentStream && CFReadStreamGetStatus(form->currentStream) == kCFStreamStatusAtEnd) { … … 231 233 } 232 234 233 static void formClose(CFReadStreamRef stream, void *context)234 { 235 FormStreamFields *form = (FormStreamFields *)context;235 static void formClose(CFReadStreamRef stream, void* context) 236 { 237 FormStreamFields* form = static_cast<FormStreamFields*>(context); 236 238 237 239 closeCurrentStream(form); 238 240 } 239 241 240 static void formSchedule(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode, void *context)241 { 242 FormStreamFields *form = (FormStreamFields *)context;243 244 if (form->currentStream) {242 static void formSchedule(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode, void* context) 243 { 244 FormStreamFields* form = static_cast<FormStreamFields*>(context); 245 246 if (form->currentStream) 245 247 CFReadStreamScheduleWithRunLoop(form->currentStream, runLoop, runLoopMode); 246 }247 248 SchedulePair pair = { runLoop, runLoopMode }; 248 249 CFSetAddValue(form->scheduledRunLoopPairs, &pair); 249 250 } 250 251 251 static void formUnschedule(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode, void *context)252 { 253 FormStreamFields *form = (FormStreamFields *)context;254 255 if (form->currentStream) {252 static void formUnschedule(CFReadStreamRef stream, CFRunLoopRef runLoop, CFStringRef runLoopMode, void* context) 253 { 254 FormStreamFields* form = static_cast<FormStreamFields*>(context); 255 256 if (form->currentStream) 256 257 CFReadStreamUnscheduleFromRunLoop(form->currentStream, runLoop, runLoopMode); 257 }258 258 SchedulePair pair = { runLoop, runLoopMode }; 259 259 CFSetRemoveValue(form->scheduledRunLoopPairs, &pair); 260 260 } 261 261 262 static void formEventCallback(CFReadStreamRef stream, CFStreamEventType type, void *context)263 { 264 FormStreamFields *form = (FormStreamFields *)context;262 static void formEventCallback(CFReadStreamRef stream, CFStreamEventType type, void* context) 263 { 264 FormStreamFields* form = static_cast<FormStreamFields*>(context); 265 265 266 266 switch (type) { … … 291 291 } 292 292 293 void webSetHTTPBody(NSMutableURLRequest *request, NSArray *formData)294 { 295 size_t count = [formData count];293 void setHTTPBody(NSMutableURLRequest *request, const FormData& formData) 294 { 295 size_t count = formData.elements().size(); 296 296 297 297 // Handle the common special case of one piece of form data, with no files. 298 298 if (count == 1) { 299 id d = [formData objectAtIndex:0]; 300 if ([d isKindOfClass:[NSData class]]) { 301 [request setHTTPBody:(NSData *)d]; 299 const FormDataElement& element = formData.elements()[0]; 300 if (element.m_type == FormDataElement::data) { 301 NSData *data = [[NSData alloc] initWithBytes:element.m_data.data() length:element.m_data.size()]; 302 [request setHTTPBody:data]; 303 [data release]; 302 304 return; 303 305 } … … 306 308 // Precompute the content length so NSURLConnection doesn't use chunked mode. 307 309 long long length = 0; 308 unsigned i; 309 for (i = 0; i < count; ++i) { 310 id data = [formData objectAtIndex:i]; 311 if ([data isKindOfClass:[NSData class]]) { 312 NSData *d = data; 313 length += [d length]; 314 } else if ([data isKindOfClass:[NSString class]]) { 315 NSString *s = data; 310 for (size_t i = 0; i < count; ++i) { 311 const FormDataElement& element = formData.elements()[i]; 312 if (element.m_type == FormDataElement::data) 313 length += element.m_data.size(); 314 else { 316 315 struct stat sb; 317 int statResult = stat( [s fileSystemRepresentation], &sb);318 if (statResult == 0 && (sb.st_mode & S_IFMT) == S_IFREG) {316 int statResult = stat(element.m_filename.utf8(), &sb); 317 if (statResult == 0 && (sb.st_mode & S_IFMT) == S_IFREG) 319 318 length += sb.st_size; 320 }321 } else {322 LOG_ERROR("item in form data array is neither NSData nor NSString");323 return;324 319 } 325 320 } … … 329 324 330 325 // Create and set the stream. 331 CFReadStreamRef stream = wkCreateCustomCFReadStream(formCreate, formFinalize, formOpen, formRead, formCanRead, formClose, formSchedule, formUnschedule, formData); 326 CFReadStreamRef stream = wkCreateCustomCFReadStream(formCreate, formFinalize, 327 formOpen, formRead, formCanRead, formClose, formSchedule, formUnschedule, 328 const_cast<FormData*>(&formData)); 332 329 [request setHTTPBodyStream:(NSInputStream *)stream]; 333 330 CFRelease(stream); 334 331 } 332 333 } -
trunk/WebCore/loader/mac/WebSubresourceLoader.h
r17407 r17408 41 41 namespace WebCore { 42 42 43 class FormData; 43 44 class String; 44 45 class ResourceLoader; -
trunk/WebCore/loader/mac/WebSubresourceLoader.mm
r17407 r17408 35 35 #import "LoaderNSURLExtras.h" 36 36 #import "LoaderNSURLRequestExtras.h" 37 #import "FormDataMac.h"38 37 #import "ResourceLoader.h" 39 38 #import "WebCoreFrameBridge.h" … … 83 82 // FIXME: Because of <rdar://problem/4803505>, the method has to be set before the body. 84 83 [newRequest setHTTPMethod:request.httpMethod()]; 85 if (!request.httpBody(). elements().isEmpty())86 webSetHTTPBody(newRequest, arrayFromFormData(request.httpBody()));84 if (!request.httpBody().isEmpty()) 85 setHTTPBody(newRequest, request.httpBody()); 87 86 88 87 wkSupportsMultipartXMixedReplace(newRequest); -
trunk/WebCore/platform/network/mac/ResourceLoaderMac.mm
r17407 r17408 34 34 #import "FrameMac.h" 35 35 #import "KURL.h" 36 #import "FormDataMac.h"37 36 #import "LoaderFunctions.h" 38 37 #import "Logging.h" -
trunk/WebKit/ChangeLog
r17405 r17408 1 2006-10-29 Darin Adler <darin@apple.com> 2 3 Reviewed by Maciej. 4 5 - eliminate use of NSArray to carry form data around 6 (the code in this framework was actually using the NSArray to hold a single 7 NSData anyway, so I just went back to an NSData for now) 8 9 * History/WebHistoryItem.m: 10 (-[WebHistoryItem _setFormInfoFromRequest:]): 11 (-[WebHistoryItem formData]): 12 * History/WebHistoryItemPrivate.h: 13 * WebCoreSupport/WebFrameLoaderClient.mm: 14 (WebFrameLoaderClient::dispatchWillSubmitForm): 15 * WebView/WebFrame.mm: 16 (-[WebFrame _loadItem:withLoadType:]): 17 1 18 2006-10-28 Darin Adler <darin@apple.com> 2 19 -
trunk/WebKit/History/WebHistoryItem.m
r17238 r17408 75 75 int visitCount; 76 76 // info used to repost form data 77 NS Array*formData;77 NSData *formData; 78 78 NSString *formContentType; 79 79 NSString *formReferrer; … … 485 485 - (void)_setFormInfoFromRequest:(NSURLRequest *)request 486 486 { 487 NS Array*newData = nil;487 NSData *newData = nil; 488 488 NSString *newContentType = nil; 489 489 NSString *newReferrer = nil; … … 493 493 // FIXME: Eventually we have to make this smart enough to handle the case where 494 494 // we have a stream for the body to handle the "data interspersed with files" feature. 495 NSData *body = [request HTTPBody]; 496 if (body) { 497 body = [body copy]; 498 newData = [[NSArray alloc] initWithObjects:body, nil]; 499 [body release]; 500 } 501 495 newData = [[request HTTPBody] copy]; 502 496 newContentType = [[request _web_HTTPContentType] copy]; 503 497 newReferrer = [[request _web_HTTPReferrer] copy]; … … 514 508 } 515 509 516 - (NS Array*)formData510 - (NSData *)formData 517 511 { 518 512 return _private->formData; -
trunk/WebKit/History/WebHistoryItemPrivate.h
r15106 r17408 53 53 - (NSArray *)documentState; 54 54 - (BOOL)isTargetItem; 55 - (NS Array*)formData;55 - (NSData *)formData; 56 56 - (NSString *)formContentType; 57 57 - (NSString *)formReferrer; -
trunk/WebKit/WebCoreSupport/WebFrameLoaderClient.mm
r17405 r17408 691 691 HashMap<String, String>::const_iterator end = formState->values().end(); 692 692 for (HashMap<String, String>::const_iterator it = formState->values().begin(); it != end; ++it) 693 [dictionary setObject:it->second forKey:it->first]; 693 if (!it->first.isNull() && !it->second.isNull()) 694 [dictionary setObject:it->second forKey:it->first]; 694 695 695 696 [formDelegate frame:m_webFrame.get() -
trunk/WebKit/WebView/WebFrame.mm
r17405 r17408 414 414 NSURL *itemOriginalURL = [NSURL _web_URLWithDataAsString:[item originalURLString]]; 415 415 NSURL *currentURL = [[[self dataSource] request] URL]; 416 NS Array*formData = [item formData];416 NSData *formData = [item formData]; 417 417 418 418 // Are we navigating to an anchor within the page? … … 484 484 [request setHTTPMethod:@"POST"]; 485 485 [request _web_setHTTPReferrer:[item formReferrer]]; 486 webSetHTTPBody(request, formData);486 [request setHTTPBody:formData]; 487 487 [request _web_setHTTPContentType:[item formContentType]]; 488 488
Note: See TracChangeset
for help on using the changeset viewer.