d2487acc53819ca9b3a5f6df519408c3e4293e93 tdreszer Wed Oct 6 14:22:33 2010 -0700 Make cgi references to style sheets (css files) actually point to timestamped link. Common code is also used for js files diff --git src/hg/lib/jsHelper.c src/hg/lib/jsHelper.c index a4aeb46..bb89214 100644 --- src/hg/lib/jsHelper.c +++ src/hg/lib/jsHelper.c @@ -19,6 +19,7 @@ #include "hPrint.h" #include "hash.h" #include "jsHelper.h" +#include "web.h" #include "hui.h" #include "hgConfig.h" #include "portable.h" @@ -26,8 +27,6 @@ static char const rcsid[] = "$Id: jsHelper.c,v 1.31 2009/09/10 04:19:26 larrym Exp $"; static boolean jsInited = FALSE; -static boolean defaultWarningShown = FALSE; -struct hash *includedFiles = NULL; void jsInit() /* If this is the first call, set window.onload to the operations @@ -338,93 +337,19 @@ * the noScriptMsg parameter (the string may contain HTML markup). A default msg is provided * if noScriptMsg == NULL; noscript msg is suppressed if noScriptMsg == "" (this is useful * if you want to more carefully control where the message will appear on the page). */ - -if(!includedFiles) - includedFiles = newHash(0); -if(hashLookup(includedFiles, fileName) == NULL) - { - char *docRoot = hDocumentRoot(); - struct dyString *noScriptBuf = dyStringNew(0); - char baseName[PATH_LEN]; - struct dyString *fileNameWithVersion = dyStringNew(0); - // dirName is configurable to allow developer specific javascript for developers on hgwdev; - // e.g. "javaScriptDir js/larrym" - char *dirName = cfgOptionDefault("browser.javaScriptDir", "js"); - splitPath(fileName, NULL, baseName, NULL); - - /* tolerate missing docRoot (i.e. when running from command line) */ - if(docRoot != NULL) - { - struct dyString *fullDirName = dyStringNew(0); - dyStringPrintf(fullDirName, "%s/%s", docRoot, dirName); - if(fileExists(dyStringContents(fullDirName))) - { - struct dyString *realFileName = dyStringNew(0); - struct dyString *fullNameWithVersion = dyStringNew(0); - long mtime; - - dyStringPrintf(realFileName, "%s/%s", dyStringContents(fullDirName), fileName); - if(!fileExists(dyStringContents(realFileName))) - { - errAbort("jsIncludeFile: javascript file: %s doesn't exist.\n", dyStringContents(realFileName)); - } - mtime = fileModTime(dyStringContents(realFileName)); - - // We add mtime to create a pseudo-version; this forces browsers to reload js file when it changes, - // which fixes bugs and odd behavior that occurs when the browser caches modified js files. - // We initially tried the simpler solution of appending the mtime as a query parameter (e.g. "?v=123456789"), - // but that reportedly caused problems in some versions of Firefox. - - dyStringPrintf(fileNameWithVersion, "%s-%ld.js", baseName, mtime); - dyStringPrintf(fullNameWithVersion, "%s/%s", dyStringContents(fullDirName), dyStringContents(fileNameWithVersion)); - if(!fileExists(dyStringContents(fullNameWithVersion))) +char *link = webTimeStampedLinkToResourceOnFirstCall(fileName,TRUE); +if (link != NULL) { - // The versioned copy should be created by the install process; however, mirrors may fail - // to preserve mtime's when copying over the javascript files, in which cased the - // versioned softlinks won't match the real file; in that case, we try to create - // the versioned links on the fly (which requires write access to the javascript directory). - - struct dyString *pattern = dyStringNew(0); - struct slName *files, *file; - dyStringPrintf(pattern, "%s-[0-9]+\\.js", baseName); - files = listDirRegEx(dyStringContents(fullDirName), dyStringContents(pattern), REG_EXTENDED); - for (file = files; file != NULL; file = file->next) - { - struct dyString *tmp = dyStringNew(0); - dyStringPrintf(tmp, "%s/%s", dyStringContents(fullDirName), file->name); - unlink(dyStringContents(tmp)); - dyStringFree(&tmp); - } - slFreeList(&files); - dyStringFree(&pattern); - if(symlink(dyStringContents(realFileName), dyStringContents(fullNameWithVersion))) - { - int err = errno; - errAbort("jsIncludeFile: symlink failed: errno: %d (%s); the directory '%s' must be writeable by user '%s'; alternatively, the installation process must create the versioned files\n", - err, strerror(err), dyStringContents(fullDirName), getUser()); - } - } - dyStringFree(&fullNameWithVersion); - dyStringFree(&fullDirName); - } - else - { - errAbort("jsIncludeFile: javascript dir: %s doesn't exist.\n", dyStringContents(fullDirName)); - } - dyStringFree(&fullDirName); - } - hashAdd(includedFiles, fileName, NULL); + static boolean defaultWarningShown = FALSE; if(noScriptMsg == NULL && !defaultWarningShown) { noScriptMsg = "<b>Your browser does not support JavaScript so some functionality may be missing!</b>"; - defaultWarningShown = 1; + defaultWarningShown = TRUE; } if(noScriptMsg && strlen(noScriptMsg)) - dyStringPrintf(noScriptBuf, "<noscript>%s</noscript>\n", noScriptMsg); - hPrintf("<script type='text/javascript' src='../%s/%s'></script>\n%s", dirName, - dyStringLen(fileNameWithVersion) ? dyStringContents(fileNameWithVersion) : fileName, dyStringContents(noScriptBuf)); - dyStringFree(&fileNameWithVersion); - dyStringFree(&noScriptBuf); + hPrintf("<noscript>%s</noscript>\n", noScriptMsg); + hPrintf("%s",link); + freeMem(link); } }