Changeset 88618 in webkit
- Timestamp:
- Jun 12, 2011 12:21:49 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r88617 r88618 1 2011-06-12 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Alexey Proskuryakov. 4 5 Remove trival "forward-to-client" member functions from FrameLoader 6 https://bugs.webkit.org/show_bug.cgi?id=62510 7 8 Originally, FrameLoader was supposed to abstract FrameLoaderClient, but 9 we lost that battle log ago. Nowadays, it's easier if folks just call 10 into FrameLoaderClient directly. Many of these functions have direct 11 callers already anyway. 12 13 * WebCore.exp.in: 14 * html/HTMLMediaElement.cpp: 15 (WebCore::HTMLMediaElement::createRenderer): 16 (WebCore::HTMLMediaElement::attach): 17 * loader/DocumentLoader.cpp: 18 (WebCore::DocumentLoader::setRequest): 19 (WebCore::DocumentLoader::setMainDocumentError): 20 (WebCore::DocumentLoader::setupForReplaceByMIMEType): 21 * loader/FrameLoader.cpp: 22 (WebCore::FrameLoader::didFirstLayout): 23 * loader/FrameLoader.h: 24 - cancelledError is slightly more delicate, so I'm going to move it in 25 a separate patch. 26 * loader/MainResourceLoader.cpp: 27 (WebCore::MainResourceLoader::interruptForPolicyChangeError): 28 (WebCore::MainResourceLoader::stopLoadingForPolicyChange): 29 (WebCore::MainResourceLoader::continueAfterContentPolicy): 30 (WebCore::MainResourceLoader::handleEmptyLoad): 31 (WebCore::MainResourceLoader::loadNow): 32 * loader/MainResourceLoader.h: 33 * loader/NetscapePlugInStreamLoader.cpp: 34 (WebCore::NetscapePlugInStreamLoader::didReceiveResponse): 35 * loader/PingLoader.cpp: 36 (WebCore::PingLoader::PingLoader): 37 * loader/PolicyChecker.cpp: 38 (WebCore::PolicyChecker::continueAfterNavigationPolicy): 39 * loader/ResourceLoader.cpp: 40 (WebCore::ResourceLoader::blockedError): 41 (WebCore::ResourceLoader::cannotShowURLError): 42 (WebCore::ResourceLoader::shouldUseCredentialStorage): 43 (WebCore::ResourceLoader::canAuthenticateAgainstProtectionSpace): 44 * page/ContextMenuController.cpp: 45 (WebCore::ContextMenuController::populate): 46 1 47 2011-06-12 Dan Bernstein <mitz@apple.com> 2 48 -
trunk/Source/WebCore/WebCore.exp.in
r88610 r88618 1047 1047 __ZNK7WebCore11CachedImage5imageEv 1048 1048 __ZNK7WebCore11FrameLoader10isCompleteEv 1049 __ZNK7WebCore11FrameLoader12blockedErrorERKNS_15ResourceRequestE1050 1049 __ZNK7WebCore11FrameLoader14cancelledErrorERKNS_15ResourceRequestE 1051 1050 __ZNK7WebCore11FrameLoader14frameHasLoadedEv -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r88505 r88618 336 336 337 337 if (Frame* frame = document()->frame()) 338 frame->loader()-> showMediaPlayerProxyPlugin(m_proxyWidget.get());338 frame->loader()->client()->showMediaPlayerProxyPlugin(m_proxyWidget.get()); 339 339 } 340 340 return mediaRenderer; … … 377 377 else if (m_proxyWidget) { 378 378 if (Frame* frame = document()->frame()) 379 frame->loader()-> hideMediaPlayerProxyPlugin(m_proxyWidget.get());379 frame->loader()->client()->hideMediaPlayerProxyPlugin(m_proxyWidget.get()); 380 380 } 381 381 #endif -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r88610 r88618 178 178 m_request = req; 179 179 180 // Only send webView:didReceiveServerRedirectForProvisionalLoadForFrame:if URL changed (and is non-null).180 // Only dispatchDidReceiveServerRedirectForProvisionalLoad() if URL changed (and is non-null). 181 181 // Also, don't send it when replacing unreachable URLs with alternate content. 182 182 if (!handlingUnreachableURL && !req.url().isNull() && oldURL != req.url()) 183 frameLoader()-> didReceiveServerRedirectForProvisionalLoadForFrame();183 frameLoader()->client()->dispatchDidReceiveServerRedirectForProvisionalLoad(); 184 184 } 185 185 … … 187 187 { 188 188 m_mainDocumentError = error; 189 frameLoader()-> setMainDocumentError(this, error);190 189 frameLoader()->client()->setMainDocumentError(this, error); 190 } 191 191 192 192 void DocumentLoader::clearErrors() … … 342 342 343 343 if (!doesProgressiveLoad(oldMIMEType)) { 344 frameLoader()-> revertToProvisional(this);344 frameLoader()->client()->revertToProvisionalState(this); 345 345 setupForReplace(); 346 346 RefPtr<SharedBuffer> resourceData = mainResourceData(); … … 355 355 356 356 if (doesProgressiveLoad(newMIMEType)) { 357 frameLoader()-> revertToProvisional(this);357 frameLoader()->client()->revertToProvisionalState(this); 358 358 setupForReplace(); 359 359 } -
trunk/Source/WebCore/loader/FrameLoader.cpp
r88566 r88618 264 264 } 265 265 266 bool FrameLoader::canHandleRequest(const ResourceRequest& request)267 {268 return m_client->canHandleRequest(request);269 }270 271 266 void FrameLoader::changeLocation(PassRefPtr<SecurityOrigin> securityOrigin, const KURL& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool refresh) 272 267 { … … 1078 1073 } 1079 1074 1080 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)1081 void FrameLoader::hideMediaPlayerProxyPlugin(Widget* widget)1082 {1083 m_client->hideMediaPlayerProxyPlugin(widget);1084 }1085 1086 void FrameLoader::showMediaPlayerProxyPlugin(Widget* widget)1087 {1088 m_client->showMediaPlayerProxyPlugin(widget);1089 }1090 #endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO)1091 1092 1075 String FrameLoader::outgoingReferrer() const 1093 1076 { … … 2308 2291 } 2309 2292 2310 bool FrameLoader::canShowMIMEType(const String& MIMEType) const2311 {2312 return m_client->canShowMIMEType(MIMEType);2313 }2314 2315 bool FrameLoader::representationExistsForURLScheme(const String& URLScheme)2316 {2317 return m_client->representationExistsForURLScheme(URLScheme);2318 }2319 2320 String FrameLoader::generatedMIMETypeForURLScheme(const String& URLScheme)2321 {2322 return m_client->generatedMIMETypeForURLScheme(URLScheme);2323 }2324 2325 void FrameLoader::didReceiveServerRedirectForProvisionalLoadForFrame()2326 {2327 m_client->dispatchDidReceiveServerRedirectForProvisionalLoad();2328 }2329 2330 2293 void FrameLoader::finishedLoadingDocument(DocumentLoader* loader) 2331 2294 { … … 2374 2337 { 2375 2338 m_loadType = FrameLoadTypeReplace; 2376 }2377 2378 void FrameLoader::revertToProvisional(DocumentLoader* loader)2379 {2380 m_client->revertToProvisionalState(loader);2381 2339 } 2382 2340 … … 2578 2536 if (m_stateMachine.committedFirstRealDocumentLoad() && !m_stateMachine.isDisplayingInitialEmptyDocument() && !m_stateMachine.firstLayoutDone()) 2579 2537 m_stateMachine.advanceTo(FrameLoaderStateMachine::FirstLayoutDone); 2538 2580 2539 m_client->dispatchDidFirstLayout(); 2581 2540 } … … 3368 3327 } 3369 3328 3370 void FrameLoader::setMainDocumentError(DocumentLoader* loader, const ResourceError& error)3371 {3372 m_client->setMainDocumentError(loader, error);3373 }3374 3375 3329 void FrameLoader::mainReceivedCompleteError(DocumentLoader* loader, const ResourceError&) 3376 3330 { … … 3393 3347 return error; 3394 3348 } 3395 3396 ResourceError FrameLoader::blockedError(const ResourceRequest& request) const3397 {3398 return m_client->blockedError(request);3399 }3400 3401 ResourceError FrameLoader::cannotShowURLError(const ResourceRequest& request) const3402 {3403 return m_client->cannotShowURLError(request);3404 }3405 3406 ResourceError FrameLoader::interruptionForPolicyChangeError(const ResourceRequest& request) const3407 {3408 return m_client->interruptForPolicyChangeError(request);3409 }3410 3411 ResourceError FrameLoader::fileDoesNotExistError(const ResourceResponse& response) const3412 {3413 return m_client->fileDoesNotExistError(response);3414 }3415 3416 bool FrameLoader::shouldUseCredentialStorage(ResourceLoader* loader)3417 {3418 return m_client->shouldUseCredentialStorage(loader->documentLoader(), loader->identifier());3419 }3420 3421 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)3422 bool FrameLoader::canAuthenticateAgainstProtectionSpace(ResourceLoader* loader, const ProtectionSpace& protectionSpace)3423 {3424 return m_client->canAuthenticateAgainstProtectionSpace(loader->documentLoader(), loader->identifier(), protectionSpace);3425 }3426 #endif3427 3349 3428 3350 void FrameLoader::setTitle(const StringWithDirection& title) -
trunk/Source/WebCore/loader/FrameLoader.h
r87189 r88618 129 129 unsigned long loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data); 130 130 131 bool canHandleRequest(const ResourceRequest&);132 133 131 // Also not cool. 134 132 void stopAllLoaders(ClearProvisionalItemPolicy = ShouldClearProvisionalItem); … … 153 151 static double timeOfLastCompletedLoad(); 154 152 155 bool shouldUseCredentialStorage(ResourceLoader*);156 #if USE(PROTECTION_SPACE_AUTH_CALLBACK)157 bool canAuthenticateAgainstProtectionSpace(ResourceLoader* loader, const ProtectionSpace& protectionSpace);158 #endif159 153 const ResourceRequest& originalRequest() const; 160 154 const ResourceRequest& initialRequest() const; … … 168 162 void finishedLoading(); 169 163 164 // FIXME: Move this method to ResourceLoader with the rest of the ResourceError accessors. 170 165 ResourceError cancelledError(const ResourceRequest&) const; 171 ResourceError fileDoesNotExistError(const ResourceResponse&) const;172 ResourceError blockedError(const ResourceRequest&) const;173 ResourceError cannotShowURLError(const ResourceRequest&) const;174 ResourceError interruptionForPolicyChangeError(const ResourceRequest&) const;175 166 176 167 bool isHostedByObjectElement() const; 177 168 bool isLoadingMainFrame() const; 178 bool canShowMIMEType(const String& MIMEType) const;179 bool representationExistsForURLScheme(const String& URLScheme);180 String generatedMIMETypeForURLScheme(const String& URLScheme);181 169 182 170 void reload(bool endToEndReload = false); 183 171 void reloadWithOverrideEncoding(const String& overrideEncoding); 184 172 185 void didReceiveServerRedirectForProvisionalLoadForFrame();186 173 void finishedLoadingDocument(DocumentLoader*); 187 174 bool isReplacing() const; 188 175 void setReplacing(); 189 void revertToProvisional(DocumentLoader*);190 void setMainDocumentError(DocumentLoader*, const ResourceError&);191 176 void mainReceivedCompleteError(DocumentLoader*, const ResourceError&); 192 177 bool subframeIsLoading() const; … … 309 294 310 295 void open(CachedFrameBase&); 311 312 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)313 void hideMediaPlayerProxyPlugin(Widget*);314 void showMediaPlayerProxyPlugin(Widget*);315 #endif316 296 317 297 // FIXME: Should these really be public? -
trunk/Source/WebCore/loader/MainResourceLoader.cpp
r87189 r88618 119 119 } 120 120 121 ResourceError MainResourceLoader::interrupt ionForPolicyChangeError() const122 { 123 return frameLoader()-> interruptionForPolicyChangeError(request());121 ResourceError MainResourceLoader::interruptForPolicyChangeError() const 122 { 123 return frameLoader()->client()->interruptForPolicyChangeError(request()); 124 124 } 125 125 126 126 void MainResourceLoader::stopLoadingForPolicyChange() 127 127 { 128 ResourceError error = interrupt ionForPolicyChangeError();128 ResourceError error = interruptForPolicyChangeError(); 129 129 error.setIsCancellation(true); 130 130 cancel(error); … … 259 259 bool isRemoteWebArchive = (equalIgnoringCase("application/x-webarchive", mimeType) || equalIgnoringCase("multipart/related", mimeType)) 260 260 && !m_substituteData.isValid() && !url.isLocalFile(); 261 if (!frameLoader()->c anShowMIMEType(mimeType) || isRemoteWebArchive) {261 if (!frameLoader()->client()->canShowMIMEType(mimeType) || isRemoteWebArchive) { 262 262 frameLoader()->policyChecker()->cannotShowMIMEType(r); 263 263 // Check reachedTerminalState since the load may have already been cancelled inside of _handleUnimplementablePolicyWithErrorCode::. … … 279 279 // It might have gone missing 280 280 if (frameLoader()) 281 receivedError(interrupt ionForPolicyChangeError());281 receivedError(interruptForPolicyChangeError()); 282 282 return; 283 283 … … 317 317 if (frameLoader() && !frameLoader()->isStopping()) 318 318 didFinishLoading(0); 319 } else if (shouldLoadAsEmptyDocument(url) || frameLoader()-> representationExistsForURLScheme(url.protocol()))319 } else if (shouldLoadAsEmptyDocument(url) || frameLoader()->client()->representationExistsForURLScheme(url.protocol())) 320 320 didFinishLoading(0); 321 321 } … … 511 511 String mimeType; 512 512 if (forURLScheme) 513 mimeType = frameLoader()-> generatedMIMETypeForURLScheme(url.protocol());513 mimeType = frameLoader()->client()->generatedMIMETypeForURLScheme(url.protocol()); 514 514 else 515 515 mimeType = "text/html"; … … 581 581 if (m_substituteData.isValid()) 582 582 handleDataLoadSoon(r); 583 else if (shouldLoadEmpty || frameLoader()-> representationExistsForURLScheme(url.protocol()))583 else if (shouldLoadEmpty || frameLoader()->client()->representationExistsForURLScheme(url.protocol())) 584 584 handleEmptyLoad(url, !shouldLoadEmpty); 585 585 else -
trunk/Source/WebCore/loader/MainResourceLoader.h
r86720 r88618 87 87 88 88 void receivedError(const ResourceError&); 89 ResourceError interrupt ionForPolicyChangeError() const;89 ResourceError interruptForPolicyChangeError() const; 90 90 void stopLoadingForPolicyChange(); 91 91 bool isPostOrRedirectAfterPost(const ResourceRequest& newRequest, const ResourceResponse& redirectResponse); -
trunk/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
r86720 r88618 31 31 32 32 #include "FrameLoader.h" 33 #include "FrameLoaderClient.h" 33 34 #include "DocumentLoader.h" 34 35 … … 90 91 91 92 if (response.httpStatusCode() < 100 || response.httpStatusCode() >= 400) 92 cancel(frameLoader()-> fileDoesNotExistError(response));93 cancel(frameLoader()->client()->fileDoesNotExistError(response)); 93 94 } 94 95 -
trunk/Source/WebCore/loader/PingLoader.cpp
r88458 r88618 116 116 { 117 117 unsigned long identifier = frame->page()->progress()->createUniqueIdentifier(); 118 // FIXME: Why activeDocumentLoader? I would have expected documentLoader(). 119 // Itseems like the PingLoader should be associated with the current 120 // Document in the Frame, but the activeDocumentLoader will be associated 121 // with the provisional DocumentLoader if there is a provisional 122 // DocumentLoader. 118 123 m_shouldUseCredentialStorage = frame->loader()->client()->shouldUseCredentialStorage(frame->loader()->activeDocumentLoader(), identifier); 119 124 m_handle = ResourceHandle::create(frame->loader()->networkingContext(), request, this, false, false); -
trunk/Source/WebCore/loader/PolicyChecker.cpp
r86462 r88618 154 154 155 155 if (!m_frame->loader()->client()->canHandleRequest(request)) { 156 handleUnimplementablePolicy(m_frame->loader()->c annotShowURLError(callback.request()));156 handleUnimplementablePolicy(m_frame->loader()->client()->cannotShowURLError(callback.request())); 157 157 callback.clearRequest(); 158 158 shouldContinue = false; -
trunk/Source/WebCore/loader/ResourceLoader.cpp
r87189 r88618 407 407 ResourceError ResourceLoader::blockedError() 408 408 { 409 return frameLoader()-> blockedError(m_request);409 return frameLoader()->client()->blockedError(m_request); 410 410 } 411 411 412 412 ResourceError ResourceLoader::cannotShowURLError() 413 413 { 414 return frameLoader()->c annotShowURLError(m_request);414 return frameLoader()->client()->cannotShowURLError(m_request); 415 415 } 416 416 … … 472 472 { 473 473 RefPtr<ResourceLoader> protector(this); 474 return frameLoader()-> shouldUseCredentialStorage(this);474 return frameLoader()->client()->shouldUseCredentialStorage(documentLoader(), identifier()); 475 475 } 476 476 … … 495 495 { 496 496 RefPtr<ResourceLoader> protector(this); 497 return frameLoader()->c anAuthenticateAgainstProtectionSpace(this, protectionSpace);497 return frameLoader()->client()->canAuthenticateAgainstProtectionSpace(documentLoader(), identifier(), protectionSpace); 498 498 } 499 499 #endif -
trunk/Source/WebCore/page/ContextMenuController.cpp
r85864 r88618 48 48 #include "FrameLoadRequest.h" 49 49 #include "FrameLoader.h" 50 #include "FrameLoaderClient.h" 50 51 #include "FrameSelection.h" 51 52 #include "HTMLFormElement.h" … … 695 696 KURL linkURL = m_hitTestResult.absoluteLinkURL(); 696 697 if (!linkURL.isEmpty()) { 697 if (loader->c anHandleRequest(ResourceRequest(linkURL))) {698 if (loader->client()->canHandleRequest(ResourceRequest(linkURL))) { 698 699 appendItem(OpenLinkItem, m_contextMenu.get()); 699 700 appendItem(OpenLinkInNewWindowItem, m_contextMenu.get()); … … 856 857 KURL linkURL = m_hitTestResult.absoluteLinkURL(); 857 858 if (!linkURL.isEmpty()) { 858 if (loader->c anHandleRequest(ResourceRequest(linkURL))) {859 if (loader->client()->canHandleRequest(ResourceRequest(linkURL))) { 859 860 appendItem(OpenLinkItem, m_contextMenu.get()); 860 861 appendItem(OpenLinkInNewWindowItem, m_contextMenu.get()); -
trunk/Source/WebKit/gtk/ChangeLog
r88498 r88618 1 2011-06-12 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Alexey Proskuryakov. 4 5 Remove trival "forward-to-client" member functions from FrameLoader 6 https://bugs.webkit.org/show_bug.cgi?id=62510 7 8 Update to call the FrameLoaderClient directly. Also, remove cargo-cult 9 code that checks whether FrameLoader is null. 10 11 * webkit/webkitwebview.cpp: 12 (webkit_web_view_stop_loading): 13 (webkit_web_view_can_show_mime_type): 14 1 15 2011-06-09 Martin Robinson <mrobinson@igalia.com> 2 16 -
trunk/Source/WebKit/gtk/webkit/webkitwebview.cpp
r88399 r88618 53 53 #include "FocusController.h" 54 54 #include "FrameLoader.h" 55 #include "FrameLoaderClient.h" 55 56 #include "FrameLoaderTypes.h" 56 57 #include "FrameView.h" … … 3979 3980 g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView)); 3980 3981 3981 Frame* frame = core(webView)->mainFrame(); 3982 3983 if (FrameLoader* loader = frame->loader()) 3984 loader->stopForUserCancel(); 3982 core(webView)->mainFrame()->loader()->stopForUserCancel(); 3985 3983 } 3986 3984 … … 4357 4355 4358 4356 Frame* frame = core(webkit_web_view_get_main_frame(webView)); 4359 if (FrameLoader* loader = frame->loader()) 4360 return loader->canShowMIMEType(String::fromUTF8(mimeType)); 4361 else 4362 return FALSE; 4357 return frame->loader()->client()->canShowMIMEType(String::fromUTF8(mimeType)); 4363 4358 } 4364 4359 -
trunk/Source/WebKit/mac/ChangeLog
r88576 r88618 1 2011-06-12 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Alexey Proskuryakov. 4 5 Remove trival "forward-to-client" member functions from FrameLoader 6 https://bugs.webkit.org/show_bug.cgi?id=62510 7 8 * WebCoreSupport/WebFrameNetworkingContext.mm: 9 (WebFrameNetworkingContext::blockedError): 10 1 11 2011-06-10 Tony Chang <tony@chromium.org> 2 12 -
trunk/Source/WebKit/mac/WebCoreSupport/WebFrameNetworkingContext.mm
r66794 r88618 20 20 #import "WebFrameNetworkingContext.h" 21 21 22 #import <WebCore/FrameLoaderClient.h> 22 23 #import <WebCore/Page.h> 23 24 #import <WebCore/ResourceError.h> … … 43 44 ResourceError WebFrameNetworkingContext::blockedError(const ResourceRequest& request) const 44 45 { 45 return frame()->loader()-> blockedError(request);46 return frame()->loader()->client()->blockedError(request); 46 47 } -
trunk/Source/WebKit/win/ChangeLog
r88260 r88618 1 2011-06-12 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Alexey Proskuryakov. 4 5 Remove trival "forward-to-client" member functions from FrameLoader 6 https://bugs.webkit.org/show_bug.cgi?id=62510 7 8 * WebCoreSupport/WebFrameNetworkingContext.cpp: 9 (WebFrameNetworkingContext::blockedError): 10 1 11 2011-06-06 Michael Saboff <msaboff@apple.com> 2 12 -
trunk/Source/WebKit/win/WebCoreSupport/WebFrameNetworkingContext.cpp
r67397 r88618 19 19 20 20 #include "config.h" 21 #include "WebFrameNetworkingContext.h" 21 22 22 #include " WebFrameNetworkingContext.h"23 #include "FrameLoaderClient.h" 23 24 24 25 using namespace WebCore; … … 41 42 WebCore::ResourceError WebFrameNetworkingContext::blockedError(const WebCore::ResourceRequest& request) const 42 43 { 43 return frame()->loader()-> blockedError(request);44 return frame()->loader()->client()->blockedError(request); 44 45 } -
trunk/Source/WebKit2/ChangeLog
r88607 r88618 1 2011-06-12 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Alexey Proskuryakov. 4 5 Remove trival "forward-to-client" member functions from FrameLoader 6 https://bugs.webkit.org/show_bug.cgi?id=62510 7 8 * WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm: 9 (WebKit::WebFrameNetworkingContext::blockedError): 10 1 11 2011-06-11 Stephanie Lewis <slewis@apple.com> 2 12 -
trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebFrameNetworkingContext.mm
r76991 r88618 21 21 #import "WebFrameNetworkingContext.h" 22 22 23 #import <WebCore/FrameLoaderClient.h> 23 24 #import <WebCore/Page.h> 24 25 #import <WebCore/ResourceError.h> … … 46 47 ResourceError WebFrameNetworkingContext::blockedError(const ResourceRequest& request) const 47 48 { 48 return frame()->loader()-> blockedError(request);49 return frame()->loader()->client()->blockedError(request); 49 50 } 50 51
Note: See TracChangeset
for help on using the changeset viewer.