only save content when dirty / no path